ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NmM0N2YKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNyBAQAorKi5pPz8KKy5pZGVhCit0YXJnZXQKKy5wcm9qZWN0CisuY2xhc3NwYXRoCisuRFNfU3RvcmUKK2RlcGVuZGVuY3ktcmVkdWNlZC1wb20ueG1sCmRpZmYgLS1naXQgYS9jaGVja3N1bS1tYXZlbi1wbHVnaW4vTk9USUNFIGIvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlYTNmNC4uMDAwMDAwMAotLS0gYS9jaGVja3N1bS1tYXZlbi1wbHVnaW4vTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1BcGFjaGUgU2VydmljZU1peCBDb3B5cmlnaHQgMjAwNi0yMDA4IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KZGlmZiAtLWdpdCBhL2NoZWNrc3VtLW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NWM4OGQuLjAwMDAwMDAKLS0tIGEvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotPCEtLQotCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbnMtcG9tPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjM8L3ZlcnNpb24+Ci0gICAgPHJlbGF0aXZlUGF0aD4uLi9tYXZlbi1wbHVnaW5zLXBvbS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNoZWNrc3VtLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIFNlcnZpY2VNaXggOjogUGx1Z2lucyA6OiBDaGVja3N1bSBQbHVnaW48L25hbWU+Ci0gIAotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9zZXJ2aWNlbWl4L21hdmVuLXBsdWdpbnMvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL3RydW5rPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvc2VydmljZW1peC9tYXZlbi1wbHVnaW5zL2NoZWNrc3VtLW1hdmVuLXBsdWdpbi90cnVuazwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9zZXJ2aWNlbWl4L21hdmVuLXBsdWdpbnMvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL3RydW5rPC91cmw+Ci0gIDwvc2NtPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjk8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuNS41PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm5ldC5zZi5vcGVuY3N2PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+b3BlbmNzdjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuODwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+ICAgICAKLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjQ8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNDwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0gIDxwcm9maWxlcz4KLSAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIHdhbnQgdG8gZGVwbG95IHRoZSBhcnRpZmFjdCB0byBhIHN0YWdpbmcgbG9jYXRpb24gZm9yIHBlcnVzYWwgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWx0RGVwbG95bWVudFJlcG9zaXRvcnk+JHtkZXBsb3kuYWx0UmVwb3NpdG9yeX08L2FsdERlcGxveW1lbnRSZXBvc2l0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cGRhdGVSZWxlYXNlSW5mbz50cnVlPC91cGRhdGVSZWxlYXNlSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gV2Ugd2FudCB0byBzaWduIHRoZSBhcnRpZmFjdCwgdGhlIFBPTSwgYW5kIGFsbCBhdHRhY2hlZCBhcnRpZmFjdHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFzc3BocmFzZT4ke2dwZy5wYXNzcGhyYXNlfTwvcGFzc3BocmFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpZ248L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+ZGVwbG95PC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8ZGVmYXVsdEdvYWw+ZGVwbG95PC9kZWZhdWx0R29hbD4KLSAgICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0YWNoPnRydWU8L2F0dGFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF0dGFjaD50cnVlPC9hdHRhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgIDwvcHJvZmlsZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9jaGVja3N1bS9DaGVja3N1bVZhbGlkYXRvck1vam8uamF2YSBiL2NoZWNrc3VtLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vY2hlY2tzdW0vQ2hlY2tzdW1WYWxpZGF0b3JNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTg5ZTIuLjAwMDAwMDAKLS0tIGEvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9jaGVja3N1bS9DaGVja3N1bVZhbGlkYXRvck1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5jaGVja3N1bTsKLQotaW1wb3J0IGF1LmNvbS5ieXRlY29kZS5vcGVuY3N2LkNTVlJlYWRlcjsKLWltcG9ydCBhdS5jb20uYnl0ZWNvZGUub3BlbmNzdi5DU1ZXcml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuZmFjdG9yeS5BcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIGNoZWNrc3VtcyBvZiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBwcm9qZWN0Ci0gKiBhZ2FpbnN0IHRoZSBjaGVja3N1bXMudHh0IGZpbGUuCi0gKiAKLSAqIFRoaXMgcGx1Z2luIGNhbiBhbHNvIGJlIHVzZWQgdG8gYWRkIGFsbCB0aGUgY2hlY2tzdW1zIG9mIHRoZSAKLSAqIGRlcGVuZGVuY2llcyBvZiB0aGUgY3VycmVudCBidWlsZCB0byB0aGUgY2hlY2tzdW0udHh0IGZpbGUuCi0gKiAKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uCi0gKiBAZ29hbCB2YWxpZGF0ZQotICogQHBoYXNlIHZhbGlkYXRlIAotICogQGF1dGhvciA8YSBocmVmPSJodHRwOi8vaGlyYW1jaGlyaW5vLmNvbSI+SGlyYW0gQ2hpcmlubzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja3N1bVZhbGlkYXRvck1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8gewotCi0gICAgc3RhdGljIGNoYXIgaGV4VGFibGVbXSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnfTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXZlbiBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcmVwb3NpdG9yaWVzIHdoaWNoIHdpbGwgYmUgc2VhcmNoZWQgZm9yIHNvdXJjZSBhdHRhY2htZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LnJlbW90ZUFydGlmYWN0UmVwb3NpdG9yaWVzfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCByZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllczsKLQotICAgIC8qKgotICAgICAqIExvY2FsIG1hdmVuIHJlcG9zaXRvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7bG9jYWxSZXBvc2l0b3J5fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeTsKLQotICAgIC8qKgotICAgICAqIEFydGlmYWN0IGZhY3RvcnksIG5lZWRlZCB0byBkb3dubG9hZCBzb3VyY2UgamFycyBmb3IgaW5jbHVzaW9uIGluIGNsYXNzcGF0aC4KLSAgICAgKgotICAgICAqIEBjb21wb25lbnQgcm9sZT0ib3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5mYWN0b3J5LkFydGlmYWN0RmFjdG9yeSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RGYWN0b3J5IGFydGlmYWN0RmFjdG9yeTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBcnRpZmFjdCByZXNvbHZlciwgbmVlZGVkIHRvIGRvd25sb2FkIHNvdXJjZSBqYXJzIGZvciBpbmNsdXNpb24gaW4gY2xhc3NwYXRoLgotICAgICAqCi0gICAgICogQGNvbXBvbmVudCByb2xlPSJvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x2ZXIiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0UmVzb2x2ZXIgYXJ0aWZhY3RSZXNvbHZlcjsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZmlsZSB0aGF0IGhvbGRzIGRlcGVuZGVuY3kgY2hlY2tzdW1zLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtiYXNlZGlyfS9jaGVja3N1bXMudHh0IgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGNoZWNrc3VtczsKLQotICAgIC8qKgotICAgICAqIFRoZSBjaGVja3N1bSBhbGdvcml0aG0gdXNlZCB0byBpbiB0aGUgY2hlY2tzdW1zLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IlNIQS0xIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrc3VtQWxnb3JpdGhtOwotCi0gICAgLyoqCi0gICAgICogU2hvdWxkIHdlIGdlbmVyYXRlIHRoZSBjaGVja3N1bSBmaWxlIGluc3RlYWQgb2YgdmFsaWRhdGluZyBhZ2FpbnN0IGl0PyAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZTsKLQotICAgIC8qKgotICAgICAqIFNob3VsZCB0aGUgZGVwZW5kZW5jeSBhcnRpZmFjdHMgYmUgaW5jbHVkZWQgaW4gdGhlIGNoZWNrc3VtIHZhbGlkYXRpb24/IAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZURlcGVuZGVuY3lBcnRpZmFjdHM7Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgdGhlIHBsdWdpbiBhcnRpZmFjdHMgYmUgaW5jbHVkZWQgaW4gdGhlIGNoZWNrc3VtIHZhbGlkYXRpb24/IAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZVBsdWdpbkFydGlmYWN0czsKLQotICAgIC8qKgotICAgICAqIFNob3VsZCB0aGUgcmVwb3J0IGFydGlmYWN0cyBiZSBpbmNsdWRlZCBpbiB0aGUgY2hlY2tzdW0gdmFsaWRhdGlvbj8gCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ0cnVlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlUmVwb3J0QXJ0aWZhY3RzOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBrZXkoQXJ0aWZhY3QgcG9tKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKHBvbS5nZXRHcm91cElkKCkpOwotICAgICAgICBzYi5hcHBlbmQoIi8iKTsKLSAgICAgICAgc2IuYXBwZW5kKHBvbS5nZXRBcnRpZmFjdElkKCkpOwotICAgICAgICBzYi5hcHBlbmQoIi8iKTsKLSAgICAgICAgc2IuYXBwZW5kKHBvbS5nZXRUeXBlKCkpOwotICAgICAgICBzYi5hcHBlbmQoIi8iKTsKLSAgICAgICAgc2IuYXBwZW5kKHBvbS5nZXRWZXJzaW9uKCkpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBrZXlBbnlWZXJzaW9uKEFydGlmYWN0IHBvbSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZChwb20uZ2V0R3JvdXBJZCgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIvIik7Ci0gICAgICAgIHNiLmFwcGVuZChwb20uZ2V0QXJ0aWZhY3RJZCgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIvIik7Ci0gICAgICAgIHNiLmFwcGVuZChwb20uZ2V0VHlwZSgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIvIik7Ci0gICAgICAgIHNiLmFwcGVuZCgiKiIpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0IGdldFBvbUFydGlmYWN0KEFydGlmYWN0IGFydGlmYWN0KSB7Ci0gICAgICAgIHJldHVybiBhcnRpZmFjdEZhY3RvcnkuY3JlYXRlUHJvamVjdEFydGlmYWN0KGFydGlmYWN0LmdldEdyb3VwSWQoKSwgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpLCBhcnRpZmFjdC5nZXRWZXJzaW9uKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGaWxlIHJlc29sdmUoQXJ0aWZhY3QgYXJ0aWZhY3QpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYoICFhcnRpZmFjdC5pc1Jlc29sdmVkKCkgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFydGlmYWN0UmVzb2x2ZXIucmVzb2x2ZShhcnRpZmFjdCwgcmVtb3RlQXJ0aWZhY3RSZXBvc2l0b3JpZXMsIGxvY2FsUmVwb3NpdG9yeSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVzb2x2ZSB0aGUgYXJ0aWZhY3QgZm9yICIgKyBhcnRpZmFjdCsiOiAiK2UuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJ0aWZhY3QuZ2V0RmlsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY2hlY2tzdW0oRmlsZSBmaWxlKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRGlnZXN0IG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShjaGVja3N1bUFsZ29yaXRobSk7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaXM9bnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgICAgIGJ5dGUgYnVmZmVyW10gPSBuZXcgYnl0ZVsxMDI0KjRdOwotICAgICAgICAgICAgICAgIGludCBjOwotICAgICAgICAgICAgICAgIHdoaWxlKCAoYz1pcy5yZWFkKGJ1ZmZlcikpID49IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1kLnVwZGF0ZShidWZmZXIsMCwgYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBkaWdlc3QgPSBtZC5kaWdlc3QoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcoZGlnZXN0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiQ291bGQgcmVhZCBmaWxlOiAiK2NoZWNrc3Vtcyk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIGNoZWNrc3VtIGFsZ29yaXRobTogIitjaGVja3N1bUFsZ29yaXRobSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFN0cmluZyB0b1N0cmluZyhieXRlW10gZGlnZXN0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmMgPSBuZXcgU3RyaW5nQnVpbGRlcihkaWdlc3QubGVuZ3RoKjIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2VzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmMuYXBwZW5kKCBoZXhUYWJsZVsgKChkaWdlc3RbaV0+PjQpICYgMHgwRikgXSApIDsKLSAgICAgICAgICAgIHJjLmFwcGVuZCggaGV4VGFibGVbIChkaWdlc3RbaV0gJiAweDBGKSBdICkgOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByYy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKCBnZW5lcmF0ZSApIHsKLSAgICAgICAgICAgIGdlbmVyYXRlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBMaW5rZWRIYXNoTWFwIGNoZWNrc3VtcyA9IGxvYWRDaGVja3N1bXMoKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBJdGVyYXRvciBpdCA9IGdldEFydGlmYWN0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaXQubmV4dCgpOwotICAgICAgICAgICAgQXJ0aWZhY3QgcG9tID0gZ2V0UG9tQXJ0aWZhY3QoIGFydGlmYWN0ICk7Ci0gICAgICAgICAgICBmYWlsZWQgfD0gdmFsaWRhdGVBcnRpZmFjdChjaGVja3N1bXMsIHBvbSk7Ci0gICAgICAgICAgICBmYWlsZWQgfD0gdmFsaWRhdGVBcnRpZmFjdChjaGVja3N1bXMsIGFydGlmYWN0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGZhaWxlZCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIGNoZWNrc3VtKHMpIGZvdW5kLi4gc2VlIHByZXZpb3VzIGVycm9yIG1lc3NhZ2VzIGZvciBtb3JlIGRldGFpbHMuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hlY2tzdW1zCi0gICAgICogQHBhcmFtIGFydGlmYWN0Ci0gICAgICogQHJldHVybiAtIHRydWUgaWYgdmFsaWRhdGlvbiBmYWlsZWQuCi0gICAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQXJ0aWZhY3QoTGlua2VkSGFzaE1hcCBjaGVja3N1bXMsIEFydGlmYWN0IGFydGlmYWN0KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IHJlc29sdmUoYXJ0aWZhY3QpOyAgICAgICAgCi0gICAgICAgIFN0cmluZyBzdW0gPSBjaGVja3N1bShmaWxlKTsKLSAgICAgICAgU3RyaW5nIGtleSA9IGtleShhcnRpZmFjdCk7Ci0gICAgICAgIExpc3QgbGlzdCA9IChMaXN0KWNoZWNrc3Vtcy5nZXQoa2V5KTsKLSAgICAgICAgaWYoIGxpc3QgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGxpc3QgPSAoTGlzdCljaGVja3N1bXMuZ2V0KGtleUFueVZlcnNpb24oYXJ0aWZhY3QpKTsKLSAgICAgICAgfQotICAgICAgICBpZiggbGlzdCA9PSBudWxsICkgewotICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoIk5vIGNoZWNrc3VtIHNwZWNpZmllZCBmb3IgIitrZXkrIiBpbiAiK3RoaXMuY2hlY2tzdW1zKyIgKCIrc3VtKyIpIiApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoICFsaXN0LmNvbnRhaW5zKHN1bSkgJiYgIWxpc3QuY29udGFpbnMoIioiKSApIHsKLSAgICAgICAgICAgIGdldExvZygpLmVycm9yKCJDaGVja3N1bSBtaXNtYXRjaCBmb3IgIitrZXkrIiBpbiAiK3RoaXMuY2hlY2tzdW1zKyIgZXhwZWN0ZWQgb25lIG9mICIrbGlzdCsiIGJ1dCB3YXMgIitzdW0gKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIExpbmtlZEhhc2hNYXAgY2hlY2tzdW1zID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gbW9kaWZpZWQ9dHJ1ZTsKLSAgICAgICAgdHJ5IHsgCi0gICAgICAgICAgICBjaGVja3N1bXMgPSBsb2FkQ2hlY2tzdW1zKCk7Ci0gICAgICAgICAgICBtb2RpZmllZD1mYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoIE1vam9FeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaXQgPSBnZXRBcnRpZmFjdHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIEFydGlmYWN0IHBvbSA9IGdldFBvbUFydGlmYWN0KCBhcnRpZmFjdCApOwotCi0gICAgICAgICAgICBtb2RpZmllZCB8PSBnZW5lcmF0ZUFydGlmYWN0KGNoZWNrc3VtcywgcG9tKTsKLSAgICAgICAgICAgIG1vZGlmaWVkIHw9IGdlbmVyYXRlQXJ0aWZhY3QoY2hlY2tzdW1zLCBhcnRpZmFjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIG1vZGlmaWVkICkgewotICAgICAgICAgICAgc3RvcmVDaGVja3N1bXMoY2hlY2tzdW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU2V0IGdldEFydGlmYWN0cygpIHsKLSAgICAgICAgSGFzaFNldCByYyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGlmKCBpbmNsdWRlRGVwZW5kZW5jeUFydGlmYWN0cyApIHsgCi0gICAgICAgICAgICByYy5hZGRBbGwocHJvamVjdC5nZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBpbmNsdWRlUGx1Z2luQXJ0aWZhY3RzICkgeyAKLSAgICAgICAgICAgIHJjLmFkZEFsbChwcm9qZWN0LmdldFBsdWdpbkFydGlmYWN0cygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiggaW5jbHVkZVJlcG9ydEFydGlmYWN0cyApIHsgCi0gICAgICAgICAgICByYy5hZGRBbGwocHJvamVjdC5nZXRSZXBvcnRBcnRpZmFjdHMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBjaGVja3N1bXMKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2QgbW9kaWZpZWQgdGhlIGNoZWNrc3VtcwotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUFydGlmYWN0KEhhc2hNYXAgY2hlY2tzdW1zLCBBcnRpZmFjdCBhcnRpZmFjdCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBGaWxlIGZpbGUgPSByZXNvbHZlKGFydGlmYWN0KTsKLSAgICAgICAgU3RyaW5nIHN1bSA9IGNoZWNrc3VtKGZpbGUpOwotICAgICAgICBMaXN0IHN1bXMgPSAoTGlzdCljaGVja3N1bXMuZ2V0KGtleShhcnRpZmFjdCkpOwotICAgICAgICBpZiggc3VtcyA9PSBudWxsICkgewotICAgICAgICAgICAgc3VtcyA9IChMaXN0KWNoZWNrc3Vtcy5nZXQoa2V5QW55VmVyc2lvbihhcnRpZmFjdCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBzdW1zID09IG51bGwgKSB7Ci0gICAgICAgICAgICBzdW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgc3Vtcy5hZGQoc3VtKTsKLSAgICAgICAgICAgIGNoZWNrc3Vtcy5wdXQoa2V5KGFydGlmYWN0KSwgc3Vtcyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICggIXN1bXMuY29udGFpbnMoc3VtKSAmJiAhc3Vtcy5jb250YWlucygiKiIpICkgewotICAgICAgICAgICAgICAgIHN1bXMuYWRkKHN1bSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIAotICAgIHByb3RlY3RlZCBMaW5rZWRIYXNoTWFwIGxvYWRDaGVja3N1bXMoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIExpbmtlZEhhc2hNYXAgcmMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICAKLSAgICAgICAgaWYoICFjaGVja3N1bXMuY2FuUmVhZCgpICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkNhbm5vdCByZWFkIGNoZWNrc3VtIGZpbGU6ICIrY2hlY2tzdW1zKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSW5wdXRTdHJlYW0gaXM9bnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjaGVja3N1bXMpOwotICAgICAgICAgICAgQ1NWUmVhZGVyIHJlYWRlciA9IG5ldyBDU1ZSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCAiVVRGLTgiKSwgJz0nKTsKLSAgICAgICAgICAgIFN0cmluZyBbXSBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWROZXh0KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiggbGluZS5sZW5ndGggPiAwICkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbGluZVswXS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGxpbmUubGVuZ3RoID4gMSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHQgPSBsaW5lWzFdLnNwbGl0KCJcXHwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdC5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQodFtqXS50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmMucHV0KGtleSwgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGNoZWNrc3VtIGZpbGU6ICIrY2hlY2tzdW1zKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc3RvcmVDaGVja3N1bXMoTGlua2VkSGFzaE1hcCBjaGVja3N1bXMpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3RvcmUgaXQuCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3M9bnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gZXhpc3RzID0gdGhpcy5jaGVja3N1bXMuZXhpc3RzKCk7Ci0gICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoaXMuY2hlY2tzdW1zKTsKLSAgICAgICAgICAgIENTVldyaXRlciB3cml0ZXIgPSBuZXcgQ1NWV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsICJVVEYtOCIpLCAnPScsIENTVldyaXRlci5OT19RVU9URV9DSEFSQUNURVIpOwotCi0gICAgICAgICAgICBpZiggIWV4aXN0cyApIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOZXh0KG5ldyBTdHJpbmdbXXsiIyBUaGlzIGZpbGUgdXNlcyBhICdwcm9wZXJ0eSBmaWxlIGxpa2UnIHN5bnRheCJ9KTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOZXh0KG5ldyBTdHJpbmdbXXsiIyBFbnRyaWVzIGFyZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogJ2FydGlmYWN0IiwiY2hlY2tzdW0tMXwuLi58Y2hlY2tzdW0tbicifSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmV4dChuZXcgU3RyaW5nW117IiMgV2hlcmUgYXJ0aWZhY3QgZm9sbG93cyB0aGUgZm9sbG93aW5nIGZvcm1hdDogJ2dyb3VwL2lkL3R5cGUvdmVyc2lvbicifSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmV4dChuZXcgU3RyaW5nW117IiMgWW91IGNhbiB1c2UgJyonIGZvciB0aGUgdmVyc2lvbiBvciBjaGVja3N1bSJ9KTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOZXh0KG5ldyBTdHJpbmdbXXsiIn0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hlY2tzdW1zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBpID0gKE1hcC5FbnRyeSlpdGVyYXRvci5uZXh0KCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvcjIgPSAoKExpc3QpaS5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyYXRvcjIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpaXRlcmF0b3IyLm5leHQoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGIubGVuZ3RoKCkhPTAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgifCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylpLmdldEtleSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiggdmFsdWUubGVuZ3RoKCkhPTAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5leHQobmV3IFN0cmluZ1tde2tleSx2YWx1ZX0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7IAotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOZXh0KG5ldyBTdHJpbmdbXXtrZXl9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3Qgd3JpdGU6ICIrdGhpcy5jaGVja3N1bXMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGlnbm9yZSApIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9jaGVja3N1bS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNDYyYi4uMDAwMDAwMAotLS0gYS9jaGVja3N1bS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLSAtLS0tLS0KLSBJbnRyb2R1Y3Rpb24KLSAtLS0tLS0KLSBIaXJhbSBDaGlyaW5vCi0gLS0tLS0tCi0KLX5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLX5+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotfn4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLX5+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLX5+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLX5+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLX5+IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLX5+Ci1+fiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotfn4KLX5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLX5+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi1+fiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLX5+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotfn4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotfn4gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLU1hdmVuIDIgQ2hlY2tzdW0gUGx1Z2luCi0KLSBUaGlzIHBsdWdpbiBwcm92aWRlcyB0aGUgY2FwYWJpbGl0eSB2YWxpZGF0ZSBhbmQgZ2VuZXJhdGUgY2hlY2tzdW1zCi0gb2YgdGhlIHByb2plY3QgZGVwZW5kZW5jaWVzIGFnYWluc3QgYSBjaGVja3N1bSBmaWxlIHRoYXQgaXMgaW5jbHVkZWQKLSBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0LgotIAotIEJ5IGluY2x1ZGluZyB0aGUgZGVwZW5kZW5jeSBjaGVja3N1bXMgYXMgcGFydCBvZiB5b3VyIHByb2plY3Qgc291cmNlLCAKLSB5b3UgY2FuIGRldGVjdCBhbnkgbWFsaWNpb3VzIHRhbXBlcmluZyBvZiBhcnRpZmFjdHMgdGhhdCBhcmUgZG93bmxvYWRlZCAKLSBmcm9tIHRoaXJkIHBhcnR5IHJlcG9zaXRvcmllcy4KLQotKiBHb2FscyBPdmVydmlldwotCi0gICoge3t7dmFsaWRhdGUtY2hlY2tzdW1zLW1vam8uaHRtbH1jaGVja3N1bS1tYXZlbi1wbHVnaW46dmFsaWRhdGV9fSBpcyBib3VuZCB0byB0aGUgPDw8dmFsaWRhdGU+Pj4gcGhhc2UgYW5kCi0gIGlzIHVzZWQgdG8gdmFsaWRhdGUgb3IgZ2VuZXJhdGUgdGhlIFByb2plY3QgZGVwZW5kZW5jaWVzIGFnYWluc3QgdGhlIGNoZWNrc3VtLnR4dCBmaWxlLgotCi0qIFVzYWdlCi0KLSAgSW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byB1c2UgdGhlIENoZWNrc3VtIFBsdWdpbiBjYW4gYmUgZm91bmQgaW4gdGhlCi0gIHt7e3VzYWdlLmh0bWx9dXNhZ2V9fSBwYWdlLgotICAKLSogQ2hlY2tzdW0gRmlsZSBGb3JtYXQKLQotICBUaGUgY2hlY2tzdW0udHh0IGZpbGUgaXMgYSBwcm9wZXJ0eSBmaWxlIGNvbnNpc3Rpbmcgb2YgcHJvcGVydHkga2V5cyBpbiAKLSAgdGhlICc8PDwkZ3JvdXBJZC8kYXJ0aWZhY3RJZC0kdmVyc2lvbi4kdHlwZT4+PicgZm9ybWF0IGFuZCBrZXkgdmFsdWVzIGJlaW5nIAotICB1c2luZyAnPDw8fD4+Picgc2VwYXJhdGVkIGxpc3Qgb2YgY2hlY2tzdW0gdmFsdWVzLiAgQSB3aWxkIGNhcmQsICc8PDwqPj4+JywgbWF5IGJlIAotICB1c2VkIGZvciB0aGUgdmVyc2lvbiBvciBjaGVja3N1bS4gIFdpbGQgY2FyZHMgYXJlIG5lZWRlZCBpZiB0aGUgcHJvamVjdCBpcyAKLSAgYnVpbGRpbmcgYWdhaW5zdCBhIFNOQVBTSE9UIGRlcGVuZGVuY3kgd2hvJ3MgY2hlY2tzdW0gY2hhbmdlcyB0b28gb2Z0ZW4uICAKLSAgVGhlIHdpbGQgY2FyZCBpcyBhbHNvIG5lZWRlZCBmb3IgZGVwZW5kZW5jaWVzIHdobydzIHZlcnNpb24gbnVtYmVyIGNoYW5nZXMgCi0gIGFzIHBhcnQgb2YgdGhlIHJlbGVhc2UgcHJvY2Vzcy4KLSAgCi0gIEV4YW1wbGUgY2hlY2tzdW0udHh0IGZpbGU6Ci0gICAgCi0rLS0tLS0KLWxvZzRqL2xvZzRqLTEuMi4xNS5wb209MTQ4MzQ5MDgwNWU4Zjg2YzIxMjQwOTU4NjI5OTA1ZTczM2QwNzllYgotbG9nNGovbG9nNGotMS4yLjE1Lmphcj1mMGEwZDJlMjllZDkxMDgwOGMzMzEzNWEzYTVhNTFiYmE2MzU4ZjdifGcwYjBkM2UyMmVkOTIwODA2YzNmMWZmYTNhNWE1Y2I0YTIzOThjYTIKLW9yZy5hcGFjaGUuYWN0aXZlbXEvYWN0aXZlbXEtY29yZS0qLnBvbT0qCi1vcmcuYXBhY2hlLmFjdGl2ZW1xL2FjdGl2ZW1xLWNvcmUtKi5qYXI9KgotKy0tLS0tCmRpZmYgLS1naXQgYS9jaGVja3N1bS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L3VzYWdlLmFwdCBiL2NoZWNrc3VtLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM5YWM5Li4wMDAwMDAwCi0tLSBhL2NoZWNrc3VtLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIC0tLS0tLQotIFVzYWdlCi0gLS0tLS0tCi0gSGlyYW0gQ2hpcmlubwotIC0tLS0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2FnZQotCi0qIFR5cGljYWwgQ2hlY2tzdW0gUGx1Z2luIENvbmZpZ3VyYXRpb24KLQotKy0tLS0tCi08cHJvamVjdD4KLSAgLi4uCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVja3N1bS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAJICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnZhbGlkYXRlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotICAuLi4KLSAgCi0gIDxwcm9maWxlcz4KLSAgLi4uCi0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+Z2VuZXJhdGUtY2hlY2tzdW1zPC9pZD4KLSAgICAgIDxidWlsZD4KLSAgICAgICAgPGRlZmF1bHRHb2FsPnZhbGlkYXRlPC9kZWZhdWx0R29hbD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlY2tzdW0tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgPGdvYWw+dmFsaWRhdGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxnZW5lcmF0ZT50cnVlPC9nZW5lcmF0ZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICA8L2J1aWxkPgotICAgIDwvcHJvZmlsZT4KLSAgLi4uCi0gIDwvcHJvZmlsZXM+Ci0gIAotPC9wcm9qZWN0PgotKy0tLS0tCi0KLQotKiBJbml0aWFsaXppbmcvQWRkaW5nIENoZWNrc3VtcyB0byB0aGUgY2hlY2tzdW0gZmlsZQotCi0gIElmIHlvdSB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gYWJvdmUsIHlvdSB3aWxsIGhhdmUgYSBnZW5lcmF0ZS1jaGVja3N1bXMgCi0gIHByb2ZpbGUgd2hpY2ggd2lsbCBnZW5lcmF0ZS91cGRhdGUgdGhlIGNoZWNrc3Vtcy50eHQgZmlsZS4gIFlvdSB3aWxsIAotICB0eXBpY2FsbHkgZG8gdGhpcyB3aGVuIHlvdSBmaXJzdCBzdGFydCB1c2luZyB0aGlzIHBsdWdpbiBvciB5b3UgY2hhbmdlIAotICBkZXBlbmRlbmNpZXMgaW4gdGhlIHByb2plY3QuCi0KLSstLS0tLQotbXZuIC1QIGdlbmVyYXRlLWNoZWNrc3VtcwotKy0tLS0tCi0KLSogVmFsaWRhdGluZyBDaGVja3N1bXMKLQotICBDaGVja3N1bXMgZ2V0IHZhbGlkYXRlZCBvbmNlIHRoZSBidWlsZCBoaXRzIHRoZSA8PDx2YWxpZGF0ZT4+PiBidWlsZCBwaGFzZS4KLQotKy0tLS0tCi1tdm4gaW5zdGFsbAotKy0tLS0tCmRpZmYgLS1naXQgYS9jaGVja3N1bS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi9jaGVja3N1bS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NzY1ODMuLjAwMDAwMDAKLS0tIGEvY2hlY2tzdW0tbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJNYXZlbiBTaGFkZSBQbHVnaW4iPgotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8aXRlbSBuYW1lPSJJbnRyb2R1Y3Rpb24iIGhyZWY9ImluZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkdvYWxzIiBocmVmPSJwbHVnaW4taW5mby5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJVc2FnZSIgaHJlZj0idXNhZ2UuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vTElDRU5TRSBiL2RvY3MtbWF2ZW4tcGx1Z2luL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGIxMjcuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS9kb2NzLW1hdmVuLXBsdWdpbi9OT1RJQ0UgYi9kb2NzLW1hdmVuLXBsdWdpbi9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjEyYzQuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICA9PSAgTk9USUNFIGZpbGUgZm9yIHVzZSB3aXRoIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgID09Ci0gICA9PSAgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIFNlcnZpY2VNaXggZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgID09Ci0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFRoaXMgcHJvZHVjdCBjb250YWlucyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiL2RvY3MtbWF2ZW4tcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNGVkNDcuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gCi0gIAotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbnMtcG9tPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjM8L3ZlcnNpb24+Ci0gICAgPHJlbGF0aXZlUGF0aD4uLi9tYXZlbi1wbHVnaW5zLXBvbS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+ICAgIAotICA8L3BhcmVudD4KLSAgCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgCi0gIDxhcnRpZmFjdElkPmRvY3MtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIAotICA8bmFtZT5BcGFjaGUgU2VydmljZU1peCA6OiBQbHVnaW5zIDo6IE1hdmVuMiBEb2N1bWVudGF0aW9uIEhlbHBlcjwvbmFtZT4KLSAgCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NlcnZpY2VtaXgvbWF2ZW4tcGx1Z2lucy9kb2NzLW1hdmVuLXBsdWdpbi90cnVubms8L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9zZXJ2aWNlbWl4L21hdmVuLXBsdWdpbnMvZG9jcy1tYXZlbi1wbHVnaW4vdHJ1bms8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvc2VydmljZW1peC9tYXZlbi1wbHVnaW5zL2RvY3MtbWF2ZW4tcGx1Z2luL3RydW5rPC91cmw+Ci0gIDwvc2NtPgotICAKLSAgPHByb3BlcnRpZXM+Ci0gICAgPGNvbW1vbnMtaW8udmVyc2lvbj4xLjQ8L2NvbW1vbnMtaW8udmVyc2lvbj4KLSAgICA8anVuaXQudmVyc2lvbj40Ljc8L2p1bml0LnZlcnNpb24+Ci0gICAgPG1hdmVuLXBsdWdpbi52ZXJzaW9uPjIuMC45PC9tYXZlbi1wbHVnaW4udmVyc2lvbj4KLSAgPC9wcm9wZXJ0aWVzPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHttYXZlbi1wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke21hdmVuLXBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7Y29tbW9ucy1pby52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHtqdW5pdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5teWx5bi53aWtpdGV4dDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbmZsdWVuY2UuY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMy4wLnYyMDEwMDYwOC0wMTAwLWUzeDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5teWx5bi53aWtpdGV4dDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjMuMC52MjAxMDA2MDgtMDEwMC1lM3g8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvQ29uZmx1ZW5jZVRvRG9jYm9va01vam8uamF2YSBiL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvQ29uZmx1ZW5jZVRvRG9jYm9va01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5NjM0ZS4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL0NvbmZsdWVuY2VUb0RvY2Jvb2tNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXguZG9jczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVuYW1lVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmRvY3MuY29uZmx1ZW5jZS5Db25mbHVlbmNlQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgcGFnZXMgaW4gQ29uZmx1ZW5jZSB3aWtpIG1hcmt1cCB0byBEb2Nib29rIHN5bnRheAotICoKLSAqIEBnb2FsIGNvbmZsdWVuY2UtdG8tZG9jYm9vawotICogQHBoYXNlIGdlbmVyYXRlLXJlc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgQ29uZmx1ZW5jZVRvRG9jYm9va01vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8gewotCi0gICAgLyoqCi0gICAgICogTG9jYXRpb24gb2YgdGhlIHNuaXBwZXQgY2FjaGUKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7YmFzZWRpcn0vc3JjL2NvbmZsdWVuY2UiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgaW5wdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgRG9jYm9vayBzb3VyY2VzCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kb2Nia3gvc291cmNlcyIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBvdXRwdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBGaWx0ZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGZpbGVzIHRvIGNvbnZlcnQgCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBEZWZhdWx0RmlsZUZpbHRlckltcGwoKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29uZmx1ZW5jZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgQ29uZmx1ZW5jZUNvbnZlcnRlcigpOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgZG9Db252ZXJ0KGlucHV0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9Db252ZXJ0KEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkaXJlY3RvcnkuZXhpc3RzKCkgJiYgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZGlyZWN0b3J5Lmxpc3RGaWxlcyhmaWx0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBkb0NvbnZlcnQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiQ3JlYXRpbmcgRG9jQm9vayBmcm9tICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IEZpbGVuYW1lVXRpbHMuZ2V0UGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoaW5wdXQuZ2V0QWJzb2x1dGVQYXRoKCksICIiKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUob3V0cHV0ICsgRmlsZS5zZXBhcmF0b3IgKyByZWxhdGl2ZVBhdGgsIGZpbGUuZ2V0TmFtZSgpICsgIi54bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIocmVzdWx0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLmNvbnZlcnQocmVhZGVyLCB3cml0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGNvbnZlcnQgIiArIGZpbGUsIGUpOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIERlZmF1bHQgRmlsZUZpbHRlciBpbXBsZW1lbnRhdGlvbiB0byBmaWx0ZXIgb3V0IGhpZGRlbiBmaWxlcyAoZS5nLiAuc3ZuKQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRGVmYXVsdEZpbGVGaWx0ZXJJbXBsIGltcGxlbWVudHMgRmlsZUZpbHRlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgICAgICAgIHJldHVybiAhZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiLiIpOyAgCi0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9TbmlwcGV0TW9qby5qYXZhIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9TbmlwcGV0TW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJmOTMyLi4wMDAwMDAwCi0tLSBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvU25pcHBldE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmRvY3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguZG9jcy5zbmlwcGV0LlNuaXBwZXRIYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5OwotCi0vKioKLSAqIFJlZ2lzdGVyIGEgVVJMIEhhbmRsZXIgdG8gYWxsb3cgdXNpbmcgc25pcHBldDovLyBmb3IgcHVsbGluZyBpbiBjb2RlIHNuaXBwZXRzIGZyb20KLSAqIHRoZSBTVk4gcmVwb3NpdG9yeQotICoKLSAqIEBnb2FsIHNuaXBwZXQKLSAqIEBwaGFzZSBpbml0aWFsaXplCi0gKiBAaW5oZXJpdEJ5RGVmYXVsdCBmYWxzZQotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8gewotCi0gICAgLyoqCi0gICAgICogTG9jYXRpb24gb2YgdGhlIHNuaXBwZXQgY2FjaGUKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NuaXBwZXRzIgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIHNuaXBwZXRDYWNoZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVSTCBzbmlwcGV0QmFzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJSZWdpc3RlcmluZyBhZGRpdGlvbmFsIFVSTCBoYW5kbGVycyAoc25pcHBldDovLykiKTsKLQotICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSgpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyBVUkxTdHJlYW1IYW5kbGVyIGNyZWF0ZVVSTFN0cmVhbUhhbmRsZXIoU3RyaW5nIHByb3RvY29sKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoInNuaXBwZXQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTbmlwcGV0SGFuZGxlcihTbmlwcGV0TW9qby50aGlzLCBzbmlwcGV0Q2FjaGUsIHNuaXBwZXRCYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBVUkwuc2V0VVJMU3RyZWFtSGFuZGxlckZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRMb2coKS53YXJuKCJVbmFibGUgdG8gcmVnaXN0ZXIgVVJMIGhhbmRsZXJzIG1vcmUgdGhhbiBvbmNlIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvQ29uZmx1ZW5jZUNvbnZlcnRlci5qYXZhIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL0NvbmZsdWVuY2VDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5MzQyYy4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvQ29uZmx1ZW5jZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXguZG9jcy5jb25mbHVlbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLndpa2l0ZXh0LmNvcmUucGFyc2VyLk1hcmt1cFBhcnNlcjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZG9jdW1lbnQgaW4gQ29uZmx1ZW5jZSB3aWtpIG1hcmt1cAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmx1ZW5jZUNvbnZlcnRlciB7Ci0KLSAgICBmaW5hbCBDb25mbHVlbmNlTGFuZ3VhZ2UgbWFya3VwTGFuZ3VhZ2UgPSBuZXcgQ29uZmx1ZW5jZUxhbmd1YWdlKCk7Ci0KLSAgICBwdWJsaWMgQ29uZmx1ZW5jZUNvbnZlcnRlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb252ZXJ0KFJlYWRlciByZWFkZXIsIFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIERvY0Jvb2tEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEb2NCb29rRG9jdW1lbnRCdWlsZGVyKHdyaXRlcik7Ci0gICAgICAgIE1hcmt1cFBhcnNlciBwYXJzZXIgPSBuZXcgTWFya3VwUGFyc2VyKCk7Ci0gICAgICAgIHBhcnNlci5zZXRNYXJrdXBMYW5ndWFnZShtYXJrdXBMYW5ndWFnZSk7Ci0gICAgICAgIHBhcnNlci5zZXRCdWlsZGVyKGJ1aWxkZXIpOwotICAgICAgICBwYXJzZXIucGFyc2UocmVhZGVyKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvQ29uZmx1ZW5jZUxhbmd1YWdlLmphdmEgYi9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvQ29uZmx1ZW5jZUxhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMmRmYzIuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL0NvbmZsdWVuY2VMYW5ndWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmRvY3MuY29uZmx1ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5teWx5bi5pbnRlcm5hbC53aWtpdGV4dC5jb25mbHVlbmNlLmNvcmUuYmxvY2suQWJzdHJhY3RDb25mbHVlbmNlRGVsaW1pdGVkQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29uZmx1ZW5jZS5jb3JlLmJsb2NrLkNvbG9yQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29uZmx1ZW5jZS5jb3JlLmJsb2NrLkV4dGVuZGVkUHJlZm9ybWF0dGVkQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29uZmx1ZW5jZS5jb3JlLmJsb2NrLkV4dGVuZGVkUXVvdGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5teWx5bi5pbnRlcm5hbC53aWtpdGV4dC5jb25mbHVlbmNlLmNvcmUuYmxvY2suSGVhZGluZ0Jsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLmludGVybmFsLndpa2l0ZXh0LmNvbmZsdWVuY2UuY29yZS5ibG9jay5MaXN0QmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29uZmx1ZW5jZS5jb3JlLmJsb2NrLlF1b3RlQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29uZmx1ZW5jZS5jb3JlLmJsb2NrLlRhYmxlT2ZDb250ZW50c0Jsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLmludGVybmFsLndpa2l0ZXh0LmNvbmZsdWVuY2UuY29yZS5ibG9jay5UZXh0Qm94QmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29uZmx1ZW5jZS5jb3JlLnBocmFzZS5Db25mbHVlbmNlV3JhcHBlZFBocmFzZU1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLmludGVybmFsLndpa2l0ZXh0LmNvbmZsdWVuY2UuY29yZS5waHJhc2UuRW1waGFzaXNQaHJhc2VNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5teWx5bi5pbnRlcm5hbC53aWtpdGV4dC5jb25mbHVlbmNlLmNvcmUucGhyYXNlLkltYWdlUGhyYXNlTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29uZmx1ZW5jZS5jb3JlLnBocmFzZS5TaW1wbGVQaHJhc2VNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5teWx5bi5pbnRlcm5hbC53aWtpdGV4dC5jb25mbHVlbmNlLmNvcmUucGhyYXNlLlNpbXBsZVdyYXBwZWRQaHJhc2VNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5teWx5bi5pbnRlcm5hbC53aWtpdGV4dC5jb25mbHVlbmNlLmNvcmUudG9rZW4uRXNjYXBlZENoYXJhY3RlclJlcGxhY2VtZW50VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIuQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5teWx5bi53aWtpdGV4dC5jb3JlLnBhcnNlci5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIuRG9jdW1lbnRCdWlsZGVyLkJsb2NrVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5teWx5bi53aWtpdGV4dC5jb3JlLnBhcnNlci5Eb2N1bWVudEJ1aWxkZXIuU3BhblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIuTGlua0F0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIubWFya3VwLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLndpa2l0ZXh0LmNvcmUucGFyc2VyLm1hcmt1cC5Db250ZW50U3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIubWFya3VwLlBhdHRlcm5CYXNlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIubWFya3VwLlBhdHRlcm5CYXNlZEVsZW1lbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIubWFya3VwLnRva2VuLkVudGl0eVJlZmVyZW5jZVJlcGxhY2VtZW50VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIubWFya3VwLnRva2VuLkltcGxpZWRIeXBlcmxpbmtSZXBsYWNlbWVudFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLndpa2l0ZXh0LmNvcmUucGFyc2VyLm1hcmt1cC50b2tlbi5QYXR0ZXJuRW50aXR5UmVmZXJlbmNlUmVwbGFjZW1lbnRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5teWx5bi53aWtpdGV4dC5jb3JlLnBhcnNlci5tYXJrdXAudG9rZW4uUGF0dGVybkxpbmVCcmVha1JlcGxhY2VtZW50VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIubWFya3VwLnRva2VuLlBhdHRlcm5MaXRlcmFsUmVwbGFjZW1lbnRUb2tlbjsKLQotCi1wdWJsaWMgY2xhc3MgQ29uZmx1ZW5jZUxhbmd1YWdlIGV4dGVuZHMgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29uZmx1ZW5jZS5jb3JlLkNvbmZsdWVuY2VMYW5ndWFnZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8QmxvY2s+IG5lc3RlZEJsb2NrcyA9IG5ldyBBcnJheUxpc3Q8QmxvY2s+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRTdGF0ZSBjb250ZW50U3RhdGUgPSBuZXcgQ29udGVudFN0YXRlKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhckxhbmd1YWdlU3ludGF4KCkgewotICAgICAgICBzdXBlci5jbGVhckxhbmd1YWdlU3ludGF4KCk7Ci0gICAgICAgIG5lc3RlZEJsb2Nrcy5jbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEJsb2NrPiBnZXROZXN0ZWRCbG9ja3MoKSB7Ci0gICAgICAgIHJldHVybiBuZXN0ZWRCbG9ja3M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU3RhbmRhcmRCbG9ja3MoTGlzdDxCbG9jaz4gYmxvY2tzLCBMaXN0PEJsb2NrPiBwYXJhZ3JhcGhCcmVha2luZ0Jsb2NrcykgewotICAgICAgICAvLyBJTVBPUlRBTlQgTk9URTogTW9zdCBpdGVtcyBiZWxvdyBoYXZlIG9yZGVyIGRlcGVuZGVuY2llcy4gIERPIE5PVCBSRU9SREVSIElURU1TIEJFTE9XISEKLQotICAgICAgICBIZWFkaW5nQmxvY2sgaGVhZGluZ0Jsb2NrID0gbmV3IEhlYWRpbmdCbG9jaygpOwotICAgICAgICBibG9ja3MuYWRkKGhlYWRpbmdCbG9jayk7Ci0gICAgICAgIHBhcmFncmFwaEJyZWFraW5nQmxvY2tzLmFkZChoZWFkaW5nQmxvY2spOwotICAgICAgICBuZXN0ZWRCbG9ja3MuYWRkKGhlYWRpbmdCbG9jayk7Ci0gICAgICAgIENvbmZsdWVuY2VHbG9zc2FyeUJsb2NrIGdsb3NzYXJ5QmxvY2sgPSBuZXcgQ29uZmx1ZW5jZUdsb3NzYXJ5QmxvY2soKTsKLSAgICAgICAgYmxvY2tzLmFkZChnbG9zc2FyeUJsb2NrKTsKLSAgICAgICAgcGFyYWdyYXBoQnJlYWtpbmdCbG9ja3MuYWRkKGdsb3NzYXJ5QmxvY2spOwotICAgICAgICBuZXN0ZWRCbG9ja3MuYWRkKGdsb3NzYXJ5QmxvY2spOwotICAgICAgICBMaXN0QmxvY2sgbGlzdEJsb2NrID0gbmV3IExpc3RCbG9jaygpOwotICAgICAgICBibG9ja3MuYWRkKGxpc3RCbG9jayk7Ci0gICAgICAgIHBhcmFncmFwaEJyZWFraW5nQmxvY2tzLmFkZChsaXN0QmxvY2spOwotICAgICAgICBuZXN0ZWRCbG9ja3MuYWRkKGxpc3RCbG9jayk7Ci0gICAgICAgIGJsb2Nrcy5hZGQobmV3IFF1b3RlQmxvY2soKSk7Ci0gICAgICAgIFRhYmxlQmxvY2sgdGFibGVCbG9jayA9IG5ldyBUYWJsZUJsb2NrKCk7Ci0gICAgICAgIGJsb2Nrcy5hZGQodGFibGVCbG9jayk7Ci0gICAgICAgIHBhcmFncmFwaEJyZWFraW5nQmxvY2tzLmFkZCh0YWJsZUJsb2NrKTsKLSAgICAgICAgbmVzdGVkQmxvY2tzLmFkZCh0YWJsZUJsb2NrKTsKLSAgICAgICAgRXh0ZW5kZWRRdW90ZUJsb2NrIHF1b3RlQmxvY2sgPSBuZXcgRXh0ZW5kZWRRdW90ZUJsb2NrKCk7Ci0gICAgICAgIGJsb2Nrcy5hZGQocXVvdGVCbG9jayk7Ci0gICAgICAgIHBhcmFncmFwaEJyZWFraW5nQmxvY2tzLmFkZChxdW90ZUJsb2NrKTsKLSAgICAgICAgRXh0ZW5kZWRQcmVmb3JtYXR0ZWRCbG9jayBub2Zvcm1hdEJsb2NrID0gbmV3IEV4dGVuZGVkUHJlZm9ybWF0dGVkQmxvY2soKTsKLSAgICAgICAgYmxvY2tzLmFkZChub2Zvcm1hdEJsb2NrKTsKLSAgICAgICAgcGFyYWdyYXBoQnJlYWtpbmdCbG9ja3MuYWRkKG5vZm9ybWF0QmxvY2spOwotCi0gICAgICAgIGJsb2Nrcy5hZGQobmV3IFRleHRCb3hCbG9jayhCbG9ja1R5cGUuUEFORUwsICJwYW5lbCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBibG9ja3MuYWRkKG5ldyBUZXh0Qm94QmxvY2soQmxvY2tUeXBlLk5PVEUsICJub3RlIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJsb2Nrcy5hZGQobmV3IFRleHRCb3hCbG9jayhCbG9ja1R5cGUuSU5GT1JNQVRJT04sICJpbmZvIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJsb2Nrcy5hZGQobmV3IFRleHRCb3hCbG9jayhCbG9ja1R5cGUuV0FSTklORywgIndhcm5pbmciKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYmxvY2tzLmFkZChuZXcgVGV4dEJveEJsb2NrKEJsb2NrVHlwZS5USVAsICJ0aXAiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQ29kZUJsb2NrIGNvZGVCbG9jayA9IG5ldyBDb2RlQmxvY2soKTsKLSAgICAgICAgYmxvY2tzLmFkZChjb2RlQmxvY2spOwotICAgICAgICBwYXJhZ3JhcGhCcmVha2luZ0Jsb2Nrcy5hZGQoY29kZUJsb2NrKTsKLSAgICAgICAgYmxvY2tzLmFkZChuZXcgVGFibGVPZkNvbnRlbnRzQmxvY2soKSk7Ci0gICAgICAgIENvbG9yQmxvY2sgY29sb3JCbG9jayA9IG5ldyBDb2xvckJsb2NrKCk7Ci0gICAgICAgIGJsb2Nrcy5hZGQoY29sb3JCbG9jayk7Ci0gICAgICAgIHBhcmFncmFwaEJyZWFraW5nQmxvY2tzLmFkZChjb2xvckJsb2NrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGFuZGFyZFBocmFzZU1vZGlmaWVycyhQYXR0ZXJuQmFzZWRTeW50YXggcGhyYXNlTW9kaWZpZXJTeW50YXgpIHsKLSAgICAgICAgcGhyYXNlTW9kaWZpZXJTeW50YXguYmVnaW5Hcm91cCgiKD86KD88PVtcXHNcXC4sXFxcIic/ITs6XFwpXFwoXFxbXFxdXSl8XikoPzoiLCAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwaHJhc2VNb2RpZmllclN5bnRheC5hZGQobmV3IEh5cGVybGlua1BocmFzZU1vZGlmaWVyKCkpOwotICAgICAgICBwaHJhc2VNb2RpZmllclN5bnRheC5hZGQobmV3IFNpbXBsZVBocmFzZU1vZGlmaWVyKCIqIiwgU3BhblR5cGUuU1RST05HLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcGhyYXNlTW9kaWZpZXJTeW50YXguYWRkKG5ldyBFbXBoYXNpc1BocmFzZU1vZGlmaWVyKCkpOwotICAgICAgICBwaHJhc2VNb2RpZmllclN5bnRheC5hZGQobmV3IFNpbXBsZVBocmFzZU1vZGlmaWVyKCI/PyIsIFNwYW5UeXBlLkNJVEFUSU9OLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcGhyYXNlTW9kaWZpZXJTeW50YXguYWRkKG5ldyBTaW1wbGVQaHJhc2VNb2RpZmllcigiLSIsIFNwYW5UeXBlLkRFTEVURUQsIHRydWUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwaHJhc2VNb2RpZmllclN5bnRheC5hZGQobmV3IFNpbXBsZVBocmFzZU1vZGlmaWVyKCIrIiwgU3BhblR5cGUuVU5ERVJMSU5FRCwgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHBocmFzZU1vZGlmaWVyU3ludGF4LmFkZChuZXcgU2ltcGxlUGhyYXNlTW9kaWZpZXIoIl4iLCBTcGFuVHlwZS5TVVBFUlNDUklQVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwaHJhc2VNb2RpZmllclN5bnRheC5hZGQobmV3IFNpbXBsZVBocmFzZU1vZGlmaWVyKCJ+IiwgU3BhblR5cGUuU1VCU0NSSVBULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHBocmFzZU1vZGlmaWVyU3ludGF4LmFkZChuZXcgU2ltcGxlV3JhcHBlZFBocmFzZU1vZGlmaWVyKCJ7eyIsICJ9fSIsIERvY3VtZW50QnVpbGRlci5TcGFuVHlwZS5NT05PU1BBQ0UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBwaHJhc2VNb2RpZmllclN5bnRheC5hZGQobmV3IENvbmZsdWVuY2VXcmFwcGVkUGhyYXNlTW9kaWZpZXIoIntxdW90ZX0iLCBEb2N1bWVudEJ1aWxkZXIuU3BhblR5cGUuUVVPVEUsIHRydWUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwaHJhc2VNb2RpZmllclN5bnRheC5hZGQobmV3IEltYWdlUGhyYXNlTW9kaWZpZXIoKSk7Ci0gICAgICAgIHBocmFzZU1vZGlmaWVyU3ludGF4LmVuZEdyb3VwKCIpKD89XFxXfCQpIiwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGFuZGFyZFRva2VucyhQYXR0ZXJuQmFzZWRTeW50YXggdG9rZW5TeW50YXgpIHsKLSAgICAgICAgdG9rZW5TeW50YXguYWRkKG5ldyBQYXR0ZXJuTGluZUJyZWFrUmVwbGFjZW1lbnRUb2tlbigiKFxcXFxcXFxcKSIpKTsgLy8gbGluZSBicmVhayAvLyROT04tTkxTLTEkCi0gICAgICAgIHRva2VuU3ludGF4LmFkZChuZXcgRXNjYXBlZENoYXJhY3RlclJlcGxhY2VtZW50VG9rZW4oKSk7IC8vIE9SREVSIERFUEVOREVOQ1kgbXVzdCBjb21lIGFmdGVyIGxpbmUgYnJlYWsKLSAgICAgICAgdG9rZW5TeW50YXguYWRkKG5ldyBFbnRpdHlSZWZlcmVuY2VSZXBsYWNlbWVudFRva2VuKCIodG0pIiwgIiM4NDgyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgdG9rZW5TeW50YXguYWRkKG5ldyBFbnRpdHlSZWZlcmVuY2VSZXBsYWNlbWVudFRva2VuKCIoVE0pIiwgIiM4NDgyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgdG9rZW5TeW50YXguYWRkKG5ldyBFbnRpdHlSZWZlcmVuY2VSZXBsYWNlbWVudFRva2VuKCIoYykiLCAiIzE2OSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHRva2VuU3ludGF4LmFkZChuZXcgRW50aXR5UmVmZXJlbmNlUmVwbGFjZW1lbnRUb2tlbigiKEMpIiwgIiMxNjkiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB0b2tlblN5bnRheC5hZGQobmV3IEVudGl0eVJlZmVyZW5jZVJlcGxhY2VtZW50VG9rZW4oIihyKSIsICIjMTc0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgdG9rZW5TeW50YXguYWRkKG5ldyBFbnRpdHlSZWZlcmVuY2VSZXBsYWNlbWVudFRva2VuKCIoUikiLCAiIzE3NCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHRva2VuU3ludGF4LmFkZChuZXcgUGF0dGVybkVudGl0eVJlZmVyZW5jZVJlcGxhY2VtZW50VG9rZW4oIig/Oig/PD1cXHdcXHMpKC0tLSkoPz1cXHNcXHcpKSIsICIjODIxMiIpKTsgLy8gZW1kYXNoIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB0b2tlblN5bnRheC5hZGQobmV3IFBhdHRlcm5FbnRpdHlSZWZlcmVuY2VSZXBsYWNlbWVudFRva2VuKCIoPzooPzw9XFx3XFxzKSgtLSkoPz1cXHNcXHcpKSIsICIjODIxMSIpKTsgLy8gZW5kYXNoIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB0b2tlblN5bnRheC5hZGQobmV3IFBhdHRlcm5MaXRlcmFsUmVwbGFjZW1lbnRUb2tlbigiKC0tLS0pIiwgIjxoci8+IikpOyAvLyBob3Jpem9udGFsIHJ1bGUgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHRva2VuU3ludGF4LmFkZChuZXcgSW1wbGllZEh5cGVybGlua1JlcGxhY2VtZW50VG9rZW4oKSk7Ci0gICAgICAgIHRva2VuU3ludGF4LmFkZChuZXcgQW5jaG9yUmVwbGFjZW1lbnRUb2tlbigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udGVudFN0YXRlIGNyZWF0ZVN0YXRlKCkgewotICAgICAgICByZXR1cm4gY29udGVudFN0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29kZUJsb2NrIGV4dGVuZHMgQWJzdHJhY3RDb25mbHVlbmNlRGVsaW1pdGVkQmxvY2sgewotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlOwotCi0gICAgICAgIHB1YmxpYyBDb2RlQmxvY2soKSB7Ci0gICAgICAgICAgICBzdXBlcigiY29kZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYmVnaW5CbG9jaygpIHsKLSAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmJlZ2luQmxvY2soRG9jdW1lbnRCdWlsZGVyLkJsb2NrVHlwZS5QQU5FTCwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcygpOwotICAgICAgICAgICAgQXR0cmlidXRlcyBwcmVBdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5zZXRMYW5ndWFnZShsYW5ndWFnZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLS8vCQlidWlsZGVyLmJlZ2luQmxvY2soRG9jdW1lbnRCdWlsZGVyLkJsb2NrVHlwZS5QUkVGT1JNQVRURUQsIHByZUF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgYnVpbGRlci5iZWdpbkJsb2NrKERvY3VtZW50QnVpbGRlci5CbG9ja1R5cGUuQ09ERSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBidWlsZGVyLmNoYXJhY3RlcnNVbmVzY2FwZWQoIjwhW0NEQVRBWyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUJsb2NrQ29udGVudChTdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgYnVpbGRlci5jaGFyYWN0ZXJzVW5lc2NhcGVkKGNvbnRlbnQpOwotICAgICAgICAgICAgYnVpbGRlci5jaGFyYWN0ZXJzVW5lc2NhcGVkKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW5kQmxvY2soKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmNoYXJhY3RlcnNVbmVzY2FwZWQoIl1dPiIpOwotICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmVuZEJsb2NrKCk7IC8vIHBhbmVsCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmVuZEJsb2NrKCk7IC8vIGNvZGUKLS8vCQlidWlsZGVyLmVuZEJsb2NrKCk7IC8vIHByZQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0gICAgICAgICAgICBzdXBlci5yZXNldFN0YXRlKCk7Ci0gICAgICAgICAgICB0aXRsZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0T3B0aW9uKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoInRpdGxlIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRpdGxlID0gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoImxhbmciKSkgewotICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0T3B0aW9uKFN0cmluZyBvcHRpb24pIHsKLSAgICAgICAgICAgIGxhbmd1YWdlID0gb3B0aW9uLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZsdWVuY2VHbG9zc2FyeUJsb2NrIGV4dGVuZHMgQmxvY2sgewotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHN0YXJ0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKi1cXHMqKyguKj8pXFxzKis6OlxccyorKC4qPylcXHMqKyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJpdmF0ZSBNYXRjaGVyIG1hdGNoZXI7Ci0gICAgICAgIHByaXZhdGUgaW50IGJsb2NrTGluZUNvdW50ID0gMDsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBwcm9jZXNzTGluZUNvbnRlbnQoU3RyaW5nIGxpbmUsIGludCBvZmZzZXQpIHsKLSAgICAgICAgICAgIGlmIChibG9ja0xpbmVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5iZWdpbkJsb2NrKEJsb2NrVHlwZS5ERUZJTklUSU9OX0xJU1QsIG5ldyBBdHRyaWJ1dGVzKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc3RhcnRQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRDbG9zZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrYmxvY2tMaW5lQ291bnQ7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWwgPSBtYXRjaGVyLmdyb3VwKDIpOwotICAgICAgICAgICAgYnVpbGRlci5iZWdpbkJsb2NrKEJsb2NrVHlwZS5ERUZJTklUSU9OX1RFUk0sIG5ldyBBdHRyaWJ1dGVzKCkpOwotICAgICAgICAgICAgbWFya3VwTGFuZ3VhZ2UuZW1pdE1hcmt1cExpbmUoZ2V0UGFyc2VyKCksIHN0YXRlLCBrZXksIDApOwotICAgICAgICAgICAgYnVpbGRlci5lbmRCbG9jaygpOwotICAgICAgICAgICAgYnVpbGRlci5iZWdpbkJsb2NrKEJsb2NrVHlwZS5ERUZJTklUSU9OX0lURU0sIG5ldyBBdHRyaWJ1dGVzKCkpOwotICAgICAgICAgICAgbWFya3VwTGFuZ3VhZ2UuZW1pdE1hcmt1cExpbmUoZ2V0UGFyc2VyKCksIHN0YXRlLCB2YWwsIDApOwotICAgICAgICAgICAgYnVpbGRlci5lbmRCbG9jaygpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNhblN0YXJ0KFN0cmluZyBsaW5lLCBpbnQgbGluZU9mZnNldCkgewotICAgICAgICAgICAgaWYgKGxpbmVPZmZzZXQgPT0gMCAmJiAhbWFya3VwTGFuZ3VhZ2UuaXNGaWx0ZXJHZW5lcmF0aXZlQ29udGVudHMoKSkgewotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzdGFydFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5tYXRjaGVzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbG9zZWQoYm9vbGVhbiBjbG9zZWQpIHsKLSAgICAgICAgICAgIGlmIChjbG9zZWQgJiYgIWlzQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdXBlci5zZXRDbG9zZWQoY2xvc2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYWJsZUJsb2NrIGV4dGVuZHMgQmxvY2sgewotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHN0YXJ0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKFxcfCguKik/KFxcfFxccyokKSkiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFRBQkxFX1JPV19QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJcXHwoXFx8KT8iICsgIigoPzooPzpbXlxcfFxcW10qKSg/OlxcW1teXFxdXSpcXF0pPykqKSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgKyAiKFxcfFxcfD9cXHMqJCk/Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcml2YXRlIGludCBibG9ja0xpbmVDb3VudCA9IDA7Ci0KLSAgICAgICAgcHJpdmF0ZSBNYXRjaGVyIG1hdGNoZXI7Ci0KLSAgICAgICAgcHVibGljIFRhYmxlQmxvY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBwcm9jZXNzTGluZUNvbnRlbnQoU3RyaW5nIGxpbmUsIGludCBvZmZzZXQpIHsKLSAgICAgICAgICAgIGlmIChibG9ja0xpbmVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmJlZ2luQmxvY2soQmxvY2tUeXBlLlRBQkxFLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWFya3VwTGFuZ3VhZ2UuaXNFbXB0eUxpbmUobGluZSkpIHsKLSAgICAgICAgICAgICAgICBzZXRDbG9zZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2Jsb2NrTGluZUNvdW50OwotCi0gICAgICAgICAgICBpZiAob2Zmc2V0ID09IGxpbmUubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB0ZXh0aWxlTGluZSA9IG9mZnNldCA9PSAwID8gbGluZSA6IGxpbmUuc3Vic3RyaW5nKG9mZnNldCk7Ci0gICAgICAgICAgICBNYXRjaGVyIHJvd01hdGNoZXIgPSBUQUJMRV9ST1dfUEFUVEVSTi5tYXRjaGVyKHRleHRpbGVMaW5lKTsKLSAgICAgICAgICAgIGlmICghcm93TWF0Y2hlci5maW5kKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRDbG9zZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuYmVnaW5CbG9jayhCbG9ja1R5cGUuVEFCTEVfUk9XLCBuZXcgQXR0cmlidXRlcygpKTsKLQotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHJvd01hdGNoZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gdGV4dGlsZUxpbmUubGVuZ3RoKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBoZWFkZXJJbmRpY2F0b3IgPSByb3dNYXRjaGVyLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gcm93TWF0Y2hlci5ncm91cCgyKS50cmltKCk7IC8vIE1PRElGSUVEOiBhZGRlZCB0cmltKCkKLSAgICAgICAgICAgICAgICBpbnQgbGluZU9mZnNldCA9IG9mZnNldCArIHJvd01hdGNoZXIuc3RhcnQoMik7Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGhlYWRlciA9IGhlYWRlckluZGljYXRvciAhPSBudWxsICYmICJ8Ii5lcXVhbHMoaGVhZGVySW5kaWNhdG9yKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmJlZ2luQmxvY2soaGVhZGVyID8gQmxvY2tUeXBlLlRBQkxFX0NFTExfSEVBREVSIDogQmxvY2tUeXBlLlRBQkxFX0NFTExfTk9STUFMLCBhdHRyaWJ1dGVzKTsKLQotICAgICAgICAgICAgICAgIG1hcmt1cExhbmd1YWdlLmVtaXRNYXJrdXBMaW5lKGdldFBhcnNlcigpLCBzdGF0ZSwgbGluZU9mZnNldCwgdGV4dCwgMCk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmVuZEJsb2NrKCk7IC8vIHRhYmxlIGNlbGwKLSAgICAgICAgICAgIH0gd2hpbGUgKHJvd01hdGNoZXIuZmluZCgpKTsKLQotICAgICAgICAgICAgYnVpbGRlci5lbmRCbG9jaygpOyAvLyB0YWJsZSByb3cKLQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNhblN0YXJ0KFN0cmluZyBsaW5lLCBpbnQgbGluZU9mZnNldCkgewotICAgICAgICAgICAgYmxvY2tMaW5lQ291bnQgPSAwOwotICAgICAgICAgICAgaWYgKGxpbmVPZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzdGFydFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5tYXRjaGVzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbG9zZWQoYm9vbGVhbiBjbG9zZWQpIHsKLSAgICAgICAgICAgIGlmIChjbG9zZWQgJiYgIWlzQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdXBlci5zZXRDbG9zZWQoY2xvc2VkKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBIeXBlcmxpbmtQaHJhc2VNb2RpZmllciBleHRlbmRzIFBhdHRlcm5CYXNlZEVsZW1lbnQgewotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhdHRlcm4oaW50IGdyb3VwT2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gIlxcWyg/OlxccyooW15cXF1cXHxdKylcXHwpPyhbXlxcXV0rKVxcXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgaW50IGdldFBhdHRlcm5Hcm91cENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFBhdHRlcm5CYXNlZEVsZW1lbnRQcm9jZXNzb3IgbmV3UHJvY2Vzc29yKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBIeXBlcmxpbmtQaHJhc2VNb2RpZmllclByb2Nlc3NvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSHlwZXJsaW5rUGhyYXNlTW9kaWZpZXJQcm9jZXNzb3IgZXh0ZW5kcyBQYXR0ZXJuQmFzZWRFbGVtZW50UHJvY2Vzc29yIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZW1pdCgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGdyb3VwKDEpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5rQ29tcG9zaXRlID0gZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBsaW5rQ29tcG9zaXRlLnNwbGl0KCJcXHMqXFx8XFxzKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBoYXBwZW4gaWYgbGlua0NvbXBvc2l0ZSBpcyAnIHwnLCBzZWUgYnVnIDI5MDQzNAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaHJlZiA9IHBhcnRzWzBdOwotICAgICAgICAgICAgICAgICAgICBpZiAoaHJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gaHJlZi50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuY2hhckF0KDApID09ICcjJykgewotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpcCA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1sxXSA6IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGlwID0gdGlwLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGhyZWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA+IDAgJiYgdGV4dC5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuY2hhckF0KDApID09ICcjJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSAiIyIgKyBzdGF0ZS5nZXRJZEdlbmVyYXRvcigpLmdldEdlbmVyYXRpb25TdHJhdGVneSgpLmdlbmVyYXRlSWQoaHJlZi5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IExpbmtBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnNldFRpdGxlKHRpcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRCdWlsZGVyKCkubGluayhhdHRyaWJ1dGVzLCBocmVmLCB0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmNoYXJBdCgwKSA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gIiMiICsgc3RhdGUuZ2V0SWRHZW5lcmF0b3IoKS5nZXRHZW5lcmF0aW9uU3RyYXRlZ3koKS5nZW5lcmF0ZUlkKGhyZWYuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIExpbmtBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgTGlua0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuc2V0VGl0bGUodGlwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuc2V0SHJlZihocmVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEJ1aWxkZXIoKS5iZWdpblNwYW4oU3BhblR5cGUuTElOSywgYXR0cmlidXRlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hcmt1cExhbmd1YWdlKCkuZW1pdE1hcmt1cExpbmUocGFyc2VyLCBzdGF0ZSwgc3RhcnQoMSksIHRleHQsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRCdWlsZGVyKCkuZW5kU3BhbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbmNob3JSZXBsYWNlbWVudFRva2VuIGV4dGVuZHMgUGF0dGVybkJhc2VkRWxlbWVudCB7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0dGVybihpbnQgZ3JvdXBPZmZzZXQpIHsKLSAgICAgICAgICAgIHJldHVybiAiXFx7YW5jaG9yOihbXlxcfV0rKVxcfSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgaW50IGdldFBhdHRlcm5Hcm91cENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFBhdHRlcm5CYXNlZEVsZW1lbnRQcm9jZXNzb3IgbmV3UHJvY2Vzc29yKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBbmNob3JSZXBsYWNlbWVudFRva2VuUHJvY2Vzc29yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbmNob3JSZXBsYWNlbWVudFRva2VuUHJvY2Vzc29yIGV4dGVuZHMgUGF0dGVybkJhc2VkRWxlbWVudFByb2Nlc3NvciB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVtaXQoKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBncm91cCgxKTsKLSAgICAgICAgICAgICAgICBuYW1lID0gc3RhdGUuZ2V0SWRHZW5lcmF0b3IoKS5nZXRHZW5lcmF0aW9uU3RyYXRlZ3koKS5nZW5lcmF0ZUlkKG5hbWUpOwotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5zZXRJZChuYW1lKTsKLSAgICAgICAgICAgICAgICBnZXRCdWlsZGVyKCkuYmVnaW5TcGFuKFNwYW5UeXBlLlNQQU4sIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIGdldEJ1aWxkZXIoKS5lbmRTcGFuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgfQotIH0KZGlmZiAtLWdpdCBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9Eb2NCb29rRG9jdW1lbnRCdWlsZGVyLmphdmEgYi9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvRG9jQm9va0RvY3VtZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2IzZjAwLi4wMDAwMDAwCi0tLSBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9Eb2NCb29rRG9jdW1lbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXguZG9jcy5jb25mbHVlbmNlOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29yZS51dGlsLmNzcy5Dc3NQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4uaW50ZXJuYWwud2lraXRleHQuY29yZS51dGlsLmNzcy5Dc3NSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLndpa2l0ZXh0LmNvcmUucGFyc2VyLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS5wYXJzZXIuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLndpa2l0ZXh0LmNvcmUucGFyc2VyLkxpbmtBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm15bHluLndpa2l0ZXh0LmNvcmUucGFyc2VyLmJ1aWxkZXIuQWJzdHJhY3RYbWxEb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS51dGlsLkZvcm1hdHRpbmdYTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubXlseW4ud2lraXRleHQuY29yZS51dGlsLlhtbFN0cmVhbVdyaXRlcjsKLQotLyoqCi0gKiBBIGJ1aWxkZXIgdGhhdCBjYW4gZW1pdCA8YSBocmVmPSJodHRwOi8vd3d3LmRvY2Jvb2sub3JnLyI+RG9jYm9vazwvYT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2NCb29rRG9jdW1lbnRCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RYbWxEb2N1bWVudEJ1aWxkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQRVJDRU5UQUdFID0gUGF0dGVybi5jb21waWxlKCIoXFxkKyklIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gQ1NTX0NMQVNTX0lOTElORSA9IFBhdHRlcm4uY29tcGlsZSgiKF58XFxzKylpbmxpbmUoXFxzK3wkKSIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTZXQ8SW50ZWdlcj4gZW50aXR5UmVmZXJlbmNlVG9Vbmljb2RlID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKLQlzdGF0aWMgewotCQllbnRpdHlSZWZlcmVuY2VUb1VuaWNvZGUuYWRkKDIxNSk7Ci0JCWVudGl0eVJlZmVyZW5jZVRvVW5pY29kZS5hZGQoODIxMSk7Ci0JCWVudGl0eVJlZmVyZW5jZVRvVW5pY29kZS5hZGQoODIxMik7Ci0JCWVudGl0eVJlZmVyZW5jZVRvVW5pY29kZS5hZGQoODIyMCk7Ci0JCWVudGl0eVJlZmVyZW5jZVRvVW5pY29kZS5hZGQoODIyMSk7Ci0JCWVudGl0eVJlZmVyZW5jZVRvVW5pY29kZS5hZGQoODIxNik7Ci0JCWVudGl0eVJlZmVyZW5jZVRvVW5pY29kZS5hZGQoODIxNyk7Ci0KLQl9Ci0KLS8vCXByaXZhdGUgU3RyaW5nIGJvb2tUaXRsZTsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBhY3JvbnltcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JcHJpdmF0ZSBpbnQgaGVhZGluZ0xldmVsID0gMDsKLQotCXByaXZhdGUgZmluYWwgU3RhY2s8QmxvY2tEZXNjcmlwdGlvbj4gYmxvY2tEZXNjcmlwdGlvbnMgPSBuZXcgU3RhY2s8QmxvY2tEZXNjcmlwdGlvbj4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RhY2s8SGVhZGluZ0Rlc2NyaXB0aW9uPiBoZWFkaW5nRGVzY3JpcHRpb25zID0gbmV3IFN0YWNrPEhlYWRpbmdEZXNjcmlwdGlvbj4oKTsKLQotCXByaXZhdGUgYm9vbGVhbiBhdXRvbWF0aWNHbG9zc2FyeSA9IHRydWU7Ci0KLSAgICBwdWJsaWMgRG9jQm9va0RvY3VtZW50QnVpbGRlcihXcml0ZXIgb3V0KSB7Ci0JCXN1cGVyKG91dCk7Ci0JfQotCi0JcHVibGljIERvY0Jvb2tEb2N1bWVudEJ1aWxkZXIoWG1sU3RyZWFtV3JpdGVyIHdyaXRlcikgewotCQlzdXBlcih3cml0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBYbWxTdHJlYW1Xcml0ZXIgY3JlYXRlWG1sU3RyZWFtV3JpdGVyKFdyaXRlciBvdXQpIHsKLQkJWG1sU3RyZWFtV3JpdGVyIHdyaXRlciA9IHN1cGVyLmNyZWF0ZVhtbFN0cmVhbVdyaXRlcihvdXQpOwotCQlyZXR1cm4gbmV3IEZvcm1hdHRpbmdYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHByZXNlcnZlV2hpdGVzcGFjZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJCQlyZXR1cm4gZWxlbWVudE5hbWUuZXF1YWxzKCJwcm9ncmFtbGlzdGluZyIpIHx8IGVsZW1lbnROYW1lLmVxdWFscygiY29kZSIpIHx8IGVsZW1lbnROYW1lLnN0YXJ0c1dpdGgoImxpdGVyYWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWNyb255bShTdHJpbmcgdGV4dCwgU3RyaW5nIGRlZmluaXRpb24pIHsKLQkJU3RyaW5nIHByZXZpb3VzRGVmID0gYWNyb255bXMucHV0KHRleHQsIGRlZmluaXRpb24pOwotCQlpZiAocHJldmlvdXNEZWYgIT0gbnVsbCAmJiBwcmV2aW91c0RlZi5sZW5ndGgoKSA+IGRlZmluaXRpb24ubGVuZ3RoKCkpIHsKLQkJCWFjcm9ueW1zLnB1dCh0ZXh0LCBwcmV2aW91c0RlZik7Ci0JCX0KLQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJnbG9zc3Rlcm0iKTsgLy8kTk9OLU5MUy0xJAotCQljaGFyYWN0ZXJzKHRleHQpOwotCQl3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbGluayhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFN0cmluZyBocmVmLCBmaW5hbCBTdHJpbmcgdGV4dCkgewotCQlsaW5rKGF0dHJpYnV0ZXMsIGhyZWYsIG5ldyBDb250ZW50RW1pdHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVtaXQoKSB7Ci0JCQkJd3JpdGVyLndyaXRlQ2hhcmFjdGVycyh0ZXh0KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxpbmsoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBTdHJpbmcgaHJlZiwgQ29udGVudEVtaXR0ZXIgZW1pdHRlcikgewotCQllbnN1cmVCbG9ja0VsZW1lbnRzT3BlbigpOwotCQlpZiAoaHJlZi5zdGFydHNXaXRoKCIjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGhyZWYubGVuZ3RoKCkgPiAxKSB7Ci0JCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJsaW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoImxpbmtlbmQiLCBocmVmLnN1YnN0cmluZygxKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbWl0dGVyLmVtaXQoKTsKLQkJCQl3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7IC8vIGxpbmsKLQkJCX0gZWxzZSB7Ci0JCQkJZW1pdHRlci5lbWl0KCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoInVsaW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZUF0dHJpYnV0ZSgidXJsIiwgaHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJCWVtaXR0ZXIuZW1pdCgpOwotCQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyB1bGluawotCQl9Ci0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyYW5zZm9ybUlkKFN0cmluZyBpZCkgewotICAgICAgICAKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludGVyZmFjZSBDb250ZW50RW1pdHRlciB7Ci0JCXB1YmxpYyB2b2lkIGVtaXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBiZWdpbkJsb2NrKEJsb2NrVHlwZSB0eXBlLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJaWYgKGhlYWRpbmdMZXZlbCA9PSAwKSB7Ci0JCQliZWdpbkhlYWRpbmcoMSwgbmV3IEF0dHJpYnV0ZXMoKSk7Ci0JCQllbmRIZWFkaW5nKCk7Ci0JCX0KLQotCQlTdHJpbmcgZWxlbWVudE5hbWU7Ci0JCVN0cmluZ1tdIGVsZW1lbnROYW1lcyA9IG51bGw7Ci0JCWJvb2xlYW4gYWxsb3dUaXRsZSA9IGZhbHNlOwotCQlib29sZWFuIGNsb3NlRWxlbWVudHNPbkJsb2NrU3RhcnQgPSBmYWxzZTsKLSAgICAgICAgQmxvY2tEZXNjcmlwdGlvbiBwcmV2aW91c0Jsb2NrID0gbnVsbDsKLQkJaWYgKCFibG9ja0Rlc2NyaXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCXByZXZpb3VzQmxvY2sgPSBibG9ja0Rlc2NyaXB0aW9ucy5wZWVrKCk7Ci0JCX0KLQotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBCVUxMRVRFRF9MSVNUOgotCQkJZWxlbWVudE5hbWUgPSAiaXRlbWl6ZWRsaXN0IjsgLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgTlVNRVJJQ19MSVNUOgotCQkJZWxlbWVudE5hbWUgPSAib3JkZXJlZGxpc3QiOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBERUZJTklUSU9OX0xJU1Q6Ci0JCQllbGVtZW50TmFtZSA9ICJ2YXJpYWJsZWxpc3QiOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vCQkJdmFyaWFibGVsaXN0Ci0JCQkvLwkJCQl2YXJsaXN0ZW50cnkrCi0JCQkvLwkJCQkJdGVybSsKLQkJCS8vCQkJCQlsaXN0aXRlbQotCQkJLy8KLQkJCWJyZWFrOwotCQljYXNlIERFRklOSVRJT05fVEVSTToKLQotCQkJQmxvY2tEZXNjcmlwdGlvbiBibG9ja0Rlc2NyaXB0aW9uID0gZmluZEJsb2NrRGVzY3JpcHRpb24oQmxvY2tUeXBlLkRFRklOSVRJT05fTElTVCk7Ci0JCQlpZiAoYmxvY2tEZXNjcmlwdGlvbi5lbnRyeVNpemUgPiAwKSB7Ci0JCQkJZW5kQmxvY2tFbnRyeShibG9ja0Rlc2NyaXB0aW9uKTsKLQkJCX0KLQkJCW9wZW5CbG9ja0VudHJ5KGJsb2NrRGVzY3JpcHRpb24sIG5ldyBTdHJpbmdbXSB7ICJ2YXJsaXN0ZW50cnkiIH0pOyAvLyROT04tTkxTLTEkCi0KLQkJCWVsZW1lbnROYW1lID0gInRlcm0iOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBERUZJTklUSU9OX0lURU06Ci0JCQllbGVtZW50TmFtZSA9ICJsaXN0aXRlbSI7IC8vJE5PTi1OTFMtMSQKLQkJCWVsZW1lbnROYW1lcyA9IG5ldyBTdHJpbmdbXSB7ICJwYXJhIiB9OyAvLyROT04tTkxTLTEkCi0JCQljbG9zZUVsZW1lbnRzT25CbG9ja1N0YXJ0ID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlIEZPT1ROT1RFOgotCQljYXNlIFBBUkFHUkFQSDoKLQkJCWVsZW1lbnROYW1lID0gInBhcmEiOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBDT0RFOgotCQkJZWxlbWVudE5hbWUgPSAicHJvZ3JhbWxpc3RpbmciOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBQUkVGT1JNQVRURUQ6Ci0JCQllbGVtZW50TmFtZSA9ICJsaXRlcmFsbGF5b3V0IjsgLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgUVVPVEU6Ci0JCQllbGVtZW50TmFtZSA9ICJibG9ja3F1b3RlIjsgLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgTElTVF9JVEVNOgotCQkJZWxlbWVudE5hbWUgPSAibGlzdGl0ZW0iOyAvLyROT04tTkxTLTEkCi0JCQllbGVtZW50TmFtZXMgPSBuZXcgU3RyaW5nW10geyAicGFyYSIgfTsgLy8kTk9OLU5MUy0xJAotCQkJY2xvc2VFbGVtZW50c09uQmxvY2tTdGFydCA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSBUQUJMRToKLQkJCWVsZW1lbnROYW1lID0gImluZm9ybWFsdGFibGUiOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBUQUJMRV9DRUxMX0hFQURFUjoKLQkJCWVsZW1lbnROYW1lID0gInRoIjsgLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgVEFCTEVfQ0VMTF9OT1JNQUw6Ci0JCQllbGVtZW50TmFtZSA9ICJ0ZCI7IC8vJE5PTi1OTFMtMSQKLQkJCWJyZWFrOwotCQljYXNlIFRBQkxFX1JPVzoKLQkJCWVsZW1lbnROYW1lID0gInRyIjsgLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgSU5GT1JNQVRJT046Ci0JCQllbGVtZW50TmFtZSA9ICJpbXBvcnRhbnQiOyAvLyROT04tTkxTLTEkCi0JCQlhbGxvd1RpdGxlID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlIE5PVEU6Ci0JCQllbGVtZW50TmFtZSA9ICJub3RlIjsgLy8kTk9OLU5MUy0xJAotCQkJYWxsb3dUaXRsZSA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSBXQVJOSU5HOgotCQkJZWxlbWVudE5hbWUgPSAid2FybmluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCWFsbG93VGl0bGUgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgVElQOgotCQkJZWxlbWVudE5hbWUgPSAidGlwIjsgLy8kTk9OLU5MUy0xJAotCQkJYWxsb3dUaXRsZSA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSBQQU5FTDoKLQkJCWVsZW1lbnROYW1lID0gIm5vdGUiOyAvLyBkb2Nib29rIGhhcyBub3RoaW5nIGJldHRlciBmb3IgJ25vdGUnIC8vJE5PTi1OTFMtMSQKLQkJCWFsbG93VGl0bGUgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgRElWOgotCQkJZWxlbWVudE5hbWUgPSBudWxsOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHR5cGUubmFtZSgpKTsKLQkJfQotCi0JCWludCBibG9ja1NpemU7Ci0JCWlmIChlbGVtZW50TmFtZSAhPSBudWxsKSB7Ci0JCQlibG9ja1NpemUgPSAxOwotCi0JCQlpZiAocHJldmlvdXNCbG9jayAhPSBudWxsICYmIHByZXZpb3VzQmxvY2suY2xvc2VFbGVtZW50c09uQmxvY2tTdGFydCkgewotCQkJCWVuZEJsb2NrRW50cnkocHJldmlvdXNCbG9jayk7Ci0JCQl9Ci0KLQkJCXdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChlbGVtZW50TmFtZSk7Ci0JCQlhcHBseUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0KLQkJCWlmIChlbGVtZW50TmFtZXMgIT0gbnVsbCkgewotCQkJCWZvciAoU3RyaW5nIG5hbWUgOiBlbGVtZW50TmFtZXMpIHsKLQkJCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGFsbG93VGl0bGUgJiYgYXR0cmlidXRlcy5nZXRUaXRsZSgpICE9IG51bGwpIHsKLQkJCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKGF0dHJpYnV0ZXMuZ2V0VGl0bGUoKSk7Ci0JCQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmxvY2tTaXplID0gMDsKLQkJfQotCQlibG9ja0Rlc2NyaXB0aW9ucy5wdXNoKG5ldyBCbG9ja0Rlc2NyaXB0aW9uKHR5cGUsIGJsb2NrU2l6ZSwgZWxlbWVudE5hbWVzLCBjbG9zZUVsZW1lbnRzT25CbG9ja1N0YXJ0KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kQmxvY2soKSB7Ci0JCWZpbmFsIEJsb2NrRGVzY3JpcHRpb24gYmxvY2tEZXNjcmlwdGlvbiA9IGJsb2NrRGVzY3JpcHRpb25zLnBvcCgpOwotCQlpbnQgc2l6ZSA9IGJsb2NrRGVzY3JpcHRpb24uc2l6ZSArIGJsb2NrRGVzY3JpcHRpb24uZW50cnlTaXplOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHNpemU7ICsreCkgewotCQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZEJsb2NrRW50cnkoQmxvY2tEZXNjcmlwdGlvbiBibG9ja0Rlc2NyaXB0aW9uKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgYmxvY2tEZXNjcmlwdGlvbi5lbnRyeVNpemU7ICsreCkgewotCQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCQl9Ci0JCWJsb2NrRGVzY3JpcHRpb24uZW50cnlTaXplID0gMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkJsb2NrRW50cnkoQmxvY2tEZXNjcmlwdGlvbiBibG9ja0Rlc2NyaXB0aW9uLCBTdHJpbmdbXSBlbnRyeSkgewotCQlmb3IgKFN0cmluZyBlbnQgOiBlbnRyeSkgewotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGVudCk7Ci0JCX0KLQkJYmxvY2tEZXNjcmlwdGlvbi5lbnRyeVNpemUgKz0gZW50cnkubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGJlZ2luSGVhZGluZyhpbnQgbGV2ZWwsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQljbG9zZVNlY3Rpb25zKE1hdGgubWF4KGxldmVsIC0gMSwgMCkpOwotCi0JCXdoaWxlIChoZWFkaW5nTGV2ZWwgPCBsZXZlbCkgewotCQkJaGVhZGluZ0xldmVsKys7Ci0KLSAgICAgICAgICAgIGlmIChoZWFkaW5nTGV2ZWwgPT0gMSkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiY2hhcHRlciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKCIiLCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgic2VjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJYXBwbHlBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkJCWF0dHJpYnV0ZXMgPSBudWxsOwotCQkJfQotCi0gICAgICAgICAgICBoZWFkaW5nRGVzY3JpcHRpb25zLnB1c2gobmV3IEhlYWRpbmdEZXNjcmlwdGlvbihsZXZlbCwgYXR0cmlidXRlcykpOwotCQl9Ci0KLQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kSGVhZGluZygpIHsKLQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyB0aXRsZQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGJlZ2luRG9jdW1lbnQoKSB7Ci0JCWJhc2VJbkhlYWQgPSBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBiZWdpblNwYW4oU3BhblR5cGUgdHlwZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWVuc3VyZUJsb2NrRWxlbWVudHNPcGVuKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIEJPTEQ6Ci0JCWNhc2UgU1RST05HOgotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJlbXBoYXNpcyIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoInJvbGUiLCAiYm9sZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJyZWFrOwotCQljYXNlIENJVEFUSU9OOgotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJjaXRhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBDT0RFOgotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJjb2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJyZWFrOwotCQljYXNlIERFTEVURUQ6Ci0JCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoImVtcGhhc2lzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZUF0dHJpYnV0ZSgicm9sZSIsICJkZWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlicmVhazsKLQkJY2FzZSBFTVBIQVNJUzoKLQkJCXdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiZW1waGFzaXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgSU5TRVJURUQ6Ci0JCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoImVtcGhhc2lzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZUF0dHJpYnV0ZSgicm9sZSIsICJpbnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlicmVhazsKLQkJY2FzZSBVTkRFUkxJTkVEOgotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJlbXBoYXNpcyIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoInJvbGUiLCAidW5kZXJsaW5lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYnJlYWs7Ci0JCWNhc2UgSVRBTElDOgotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJlbXBoYXNpcyIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoInJvbGUiLCAiaXRhbGljIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYnJlYWs7Ci0JCWNhc2UgUVVPVEU6Ci0JCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoInF1b3RlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJyZWFrOwotCQljYXNlIFNQQU46Ci0JCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoInBocmFzZSIpOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBTVUJTQ1JJUFQ6Ci0JCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoInN1YnNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJY2FzZSBTVVBFUlNDUklQVDoKLQkJCXdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgic3VwZXJzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnJlYWs7Ci0JCWNhc2UgTU9OT1NQQUNFOgotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJsaXRlcmFsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJyZWFrOwotCQljYXNlIExJTks6IHsKLQkJCUxpbmtBdHRyaWJ1dGVzIGxpbmtBdHRyaWJ1dGVzID0gKExpbmtBdHRyaWJ1dGVzKSBhdHRyaWJ1dGVzOwotCQkJU3RyaW5nIGhyZWYgPSBsaW5rQXR0cmlidXRlcy5nZXRIcmVmKCk7Ci0JCQlpZiAoaHJlZi5zdGFydHNXaXRoKCIjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgibGluayIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGhyZWYubGVuZ3RoKCkgPiAxKSB7Ci0JCQkJCXdyaXRlci53cml0ZUF0dHJpYnV0ZSgibGlua2VuZCIsIGhyZWYuc3Vic3RyaW5nKDEpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJ1bGluayIpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlQXR0cmlidXRlKCJ1cmwiLCBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUxvZ2dlci5nZXRMb2dnZXIoRG9jQm9va0RvY3VtZW50QnVpbGRlci5jbGFzcy5nZXROYW1lKCkpLndhcm5pbmcoIk5vIGRvY2Jvb2sgbWFwcGluZyBmb3IgIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoInBocmFzZSIpOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkJfQotCQlhcHBseUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGx5QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0SWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoImlkIiwgYXR0cmlidXRlcy5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldExhbmd1YWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKCJsYW5ndWFnZSIsIGF0dHJpYnV0ZXMuZ2V0TGFuZ3VhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCQljbG9zZVNlY3Rpb25zKDApOwotCi0JCXdyaXRlR2xvc3NhcnlBcHBlbmRpeCgpOwotCi0vLwkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyBib29rCi0JCXdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0KLQkJYWNyb255bXMuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvc2VTZWN0aW9ucyhpbnQgdG9MZXZlbCkgewotCQlpZiAodG9MZXZlbCA8IDApIHsKLQkJCXRvTGV2ZWwgPSAwOwotCQl9Ci0JCXdoaWxlIChoZWFkaW5nTGV2ZWwgPiB0b0xldmVsKSB7Ci0JCQl3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0JCQktLWhlYWRpbmdMZXZlbDsKLSAgICAgICAgICAgIGhlYWRpbmdEZXNjcmlwdGlvbnMucG9wKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVHbG9zc2FyeUFwcGVuZGl4KCkgewotCQlpZiAoIWFjcm9ueW1zLmlzRW1wdHkoKSAmJiBhdXRvbWF0aWNHbG9zc2FyeSkgewotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJhcHBlbmRpeCIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoImlkIiwgImdsb3NzYXJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoImlkIiwgImdsb3NzYXJ5LWVuZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXdyaXRlci53cml0ZUNoYXJhY3RlcnMoIkdsb3NzYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsgLy8gdGl0bGUKLQkJCXdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiZ2xvc3NsaXN0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGdsb3NzRW50cnkgOiBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oYWNyb255bXMpLmVudHJ5U2V0KCkpIHsKLQotCQkJCXdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiZ2xvc3NlbnRyeSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoImdsb3NzdGVybSIpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhnbG9zc0VudHJ5LmdldEtleSgpKTsKLQkJCQl3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7IC8vIGdsb3NzdGVybQotCi0JCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJnbG9zc2RlZiIpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJwYXJhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKGdsb3NzRW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyBwYXJhCi0JCQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyBnbG9zc2RlZgotCi0JCQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyBnbG9zc2VudHJ5Ci0JCQl9Ci0JCQl3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7IC8vIGdsb3NzbGlzdAotCQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyBhcHBlbmRpeAotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kU3BhbigpIHsKLQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoU3RyaW5nIHRleHQpIHsKLQkJZW5zdXJlQmxvY2tFbGVtZW50c09wZW4oKTsKLQkJc3VwZXIuY2hhcmFjdGVycyh0ZXh0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzVW5lc2NhcGVkKFN0cmluZyBsaXRlcmFsKSB7Ci0JCWVuc3VyZUJsb2NrRWxlbWVudHNPcGVuKCk7Ci0JCS8vIG5vdGU6IHRoaXMgKm1heSogaGF2ZSBIVE1MIHRhZ3MgaW4gaXQKLQkJd3JpdGVyLndyaXRlTGl0ZXJhbChsaXRlcmFsKTsKLQkJLy8JCUxvZ2dlci5nZXRMb2dnZXIoRG9jQm9va0RvY3VtZW50QnVpbGRlci5jbGFzcy5nZXROYW1lKCkpLndhcm5pbmcoIkhUTUwgbGl0ZXJhbCBub3Qgc3VwcG9ydGVkIGluIERvY0Jvb2siKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlQmxvY2tFbGVtZW50c09wZW4oKSB7Ci0JCWlmICghYmxvY2tEZXNjcmlwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQlCbG9ja0Rlc2NyaXB0aW9uIGJsb2NrRGVzY3JpcHRpb24gPSBibG9ja0Rlc2NyaXB0aW9ucy5wZWVrKCk7Ci0JCQlpZiAoYmxvY2tEZXNjcmlwdGlvbi5lbnRyeVNpemUgPT0gMCAmJiBibG9ja0Rlc2NyaXB0aW9uLm5lc3RlZEVsZW1lbnROYW1lcyAhPSBudWxsKSB7Ci0JCQkJb3BlbkJsb2NrRW50cnkoYmxvY2tEZXNjcmlwdGlvbiwgYmxvY2tEZXNjcmlwdGlvbi5uZXN0ZWRFbGVtZW50TmFtZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW50aXR5UmVmZXJlbmNlKFN0cmluZyBlbnRpdHkpIHsKLQkJZW5zdXJlQmxvY2tFbGVtZW50c09wZW4oKTsKLQkJaWYgKGVudGl0eS5zdGFydHNXaXRoKCIjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG51bWVyaWMgPSBlbnRpdHkuc3Vic3RyaW5nKDEpOwotCQkJaW50IGJhc2UgPSAxMDsKLQkJCWlmIChudW1lcmljLnN0YXJ0c1dpdGgoIngiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbnVtZXJpYyA9IGVudGl0eS5zdWJzdHJpbmcoMSk7Ci0JCQkJYmFzZSA9IDE2OwotCQkJfQotCQkJaW50IHVuaWNvZGVWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQobnVtZXJpYywgYmFzZSk7Ci0JCQlpZiAoZW50aXR5UmVmZXJlbmNlVG9Vbmljb2RlLmNvbnRhaW5zKHVuaWNvZGVWYWx1ZSkpIHsKLQkJCQl3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKCIiICsgKChjaGFyKSB1bmljb2RlVmFsdWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQl3cml0ZXIud3JpdGVFbnRpdHlSZWYoZW50aXR5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbWFnZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFN0cmluZyB1cmwpIHsKLQkJZW5zdXJlQmxvY2tFbGVtZW50c09wZW4oKTsKLQkJU3RyaW5nIGNzc0NsYXNzID0gYXR0cmlidXRlcy5nZXRDc3NDbGFzcygpOwotCQlib29sZWFuIGlubGluZWQgPSBmYWxzZTsKLQkJaWYgKGNzc0NsYXNzICE9IG51bGwgJiYgQ1NTX0NMQVNTX0lOTElORS5tYXRjaGVyKGNzc0NsYXNzKS5maW5kKCkpIHsKLQkJCWlubGluZWQgPSB0cnVlOwotCQl9Ci0JCWVtaXRJbWFnZShhdHRyaWJ1dGVzLCB1cmwsIGlubGluZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbWl0SW1hZ2UoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBTdHJpbmcgdXJsLCBib29sZWFuIGlubGluZSkgewotCQkvLyBzZWUgaHR0cDovL3d3dy5kb2Nib29rLm9yZy90ZGcvZW4vaHRtbC9pbWFnZWRhdGEteC5odG1sCi0JCWVuc3VyZUJsb2NrRWxlbWVudHNPcGVuKCk7Ci0JCXdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChpbmxpbmUgPyAiaW5saW5lbWVkaWFvYmplY3QiIDogIm1lZGlhb2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhcHBseUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCXdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiaW1hZ2VvYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGVFbXB0eUVsZW1lbnQoImltYWdlZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZUF0dHJpYnV0ZSgiZmlsZXJlZiIsIG1ha2VVcmxBYnNvbHV0ZSh1cmwpKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY3NzU3R5bGUgPSBhdHRyaWJ1dGVzLmdldENzc1N0eWxlKCk7Ci0JCWlmIChjc3NTdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgd2lkdGggPSBudWxsOwotCQkJU3RyaW5nIGRlcHRoID0gbnVsbDsKLQkJCUl0ZXJhdG9yPENzc1J1bGU+IHJ1bGVJdGVyYXRvciA9IG5ldyBDc3NQYXJzZXIoKS5jcmVhdGVSdWxlSXRlcmF0b3IoY3NzU3R5bGUpOwotCQkJd2hpbGUgKHJ1bGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDc3NSdWxlIHJ1bGUgPSBydWxlSXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICgid2lkdGgiLmVxdWFscyhydWxlLm5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd2lkdGggPSBydWxlLnZhbHVlOwotCQkJCX0gZWxzZSBpZiAoImhlaWdodCIuZXF1YWxzKHJ1bGUubmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZXB0aCA9IHJ1bGUudmFsdWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHdpZHRoICE9IG51bGwpIHsKLQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBQRVJDRU5UQUdFLm1hdGNoZXIod2lkdGgpOwotCQkJCWlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoInNjYWxlIiwgbWF0Y2hlci5ncm91cCgxKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChkZXB0aCAhPSBudWxsKSB7Ci0JCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUoImRlcHRoIiwgZGVwdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyBpbWFnZW9iamVjdAotCQl3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7IC8vIGlubGluZW1lZGlhb2JqZWN0IG9yIG1lZGlhb2JqZWN0Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW1hZ2VMaW5rKEF0dHJpYnV0ZXMgbGlua0F0dHJpYnV0ZXMsIGZpbmFsIEF0dHJpYnV0ZXMgaW1hZ2VBdHRyaWJ1dGVzLCBTdHJpbmcgaHJlZiwKLQkJCWZpbmFsIFN0cmluZyBpbWFnZVVybCkgewotCQlsaW5rKGxpbmtBdHRyaWJ1dGVzLCBocmVmLCBuZXcgQ29udGVudEVtaXR0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlbWl0KCkgewotCQkJCWVtaXRJbWFnZShpbWFnZUF0dHJpYnV0ZXMsIGltYWdlVXJsLCB0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbGluZUJyZWFrKCkgewotCQllbnN1cmVCbG9ja0VsZW1lbnRzT3BlbigpOwotCQkvLyBubyBlcXVpdmFsZW50IGluIERvY0Jvb2suCi0JCWNoYXJhY3RlcnMoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIEJsb2NrRGVzY3JpcHRpb24gZmluZEJsb2NrRGVzY3JpcHRpb24oQmxvY2tUeXBlIHR5cGUpIHsKLQkJZm9yIChpbnQgeCA9IGJsb2NrRGVzY3JpcHRpb25zLnNpemUoKSAtIDE7IHggPj0gMDsgLS14KSB7Ci0JCQlCbG9ja0Rlc2NyaXB0aW9uIGJsb2NrRGVzY3JpcHRpb24gPSBibG9ja0Rlc2NyaXB0aW9ucy5nZXQoeCk7Ci0JCQlpZiAoYmxvY2tEZXNjcmlwdGlvbi50eXBlID09IHR5cGUpIHsKLQkJCQlyZXR1cm4gYmxvY2tEZXNjcmlwdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCbG9ja0Rlc2NyaXB0aW9uIHsKLSAgICAgICAgQmxvY2tUeXBlIHR5cGU7Ci0KLSAgICAgICAgaW50IHNpemU7Ci0KLSAgICAgICAgaW50IGVudHJ5U2l6ZTsgLy8gdGhlIHNpemUgb2YgYW4gZW50cnksIGlmIGl0IGlzIG9wZW4sIG90aGVyd2lzZSAwCi0KLSAgICAgICAgZmluYWwgU3RyaW5nW10gbmVzdGVkRWxlbWVudE5hbWVzOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2xvc2VFbGVtZW50c09uQmxvY2tTdGFydDsKLQotICAgICAgICBwdWJsaWMgQmxvY2tEZXNjcmlwdGlvbihEb2N1bWVudEJ1aWxkZXIuQmxvY2tUeXBlIHR5cGUsIGludCBzaXplLCBTdHJpbmdbXSBuZXN0ZWRFbGVtZW50TmFtZXMsIGJvb2xlYW4gY2xvc2VFbGVtZW50c09uQmxvY2tTdGFydCkgewotICAgICAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKLSAgICAgICAgICAgIHRoaXMuZW50cnlTaXplID0gbmVzdGVkRWxlbWVudE5hbWVzID09IG51bGwgPyAwIDogbmVzdGVkRWxlbWVudE5hbWVzLmxlbmd0aDsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLm5lc3RlZEVsZW1lbnROYW1lcyA9IG5lc3RlZEVsZW1lbnROYW1lczsKLSAgICAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50c09uQmxvY2tTdGFydCA9IGNsb3NlRWxlbWVudHNPbkJsb2NrU3RhcnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIZWFkaW5nRGVzY3JpcHRpb24gewotCi0gICAgICAgIGludCBsZXZlbDsKLSAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzOwotCi0gICAgICAgIHByaXZhdGUgSGVhZGluZ0Rlc2NyaXB0aW9uKGludCBsZXZlbCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICB9Ci0gICAgfQotCi0JLyoqCi0JICogSW5kaWNhdGUgaWYgdGhpcyBidWlsZGVyIHNob3VsZCBnZW5lcmF0ZSBhbiBhdXRvbWF0aWMgZ2xvc3NhcnkgaWYgYWNyb255bXMgYXJlIHVzZWQuIFdoZW4gdGhlIGF1dG9tYXRpYyBnbG9zc2FyeQotCSAqIGlzIGVuYWJsZWQgYW5kIGFjcm9ueW1zIGFyZSB1c2VkIGluIHRoZSBkb2N1bWVudCwgdGhlbiBhbiA8Y29kZT5hcHBlbmRpeDwvY29kZT4gd2l0aCB0aXRsZSAnR2xvc3NhcnknIGlzIGFkZGVkIHRvCi0JICogdGhlIGRvY3VtZW50LCB3aXRoIGEgPGNvZGU+Z2xvc3NsaXN0PC9jb2RlPiBnZW5lcmF0ZWQgZm9yIGFsbCBvZiB0aGUgYWNyb255bXMgdGhhdCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50LiBUaGUKLQkgKiBkZWZhdWx0IGlzIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvbWF0aWNHbG9zc2FyeSgpIHsKLQkJcmV0dXJuIGF1dG9tYXRpY0dsb3NzYXJ5OwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlIGlmIHRoaXMgYnVpbGRlciBzaG91bGQgZ2VuZXJhdGUgYW4gYXV0b21hdGljIGdsb3NzYXJ5IGlmIGFjcm9ueW1zIGFyZSB1c2VkLiBXaGVuIHRoZSBhdXRvbWF0aWMgZ2xvc3NhcnkKLQkgKiBpcyBlbmFibGVkIGFuZCBhY3JvbnltcyBhcmUgdXNlZCBpbiB0aGUgZG9jdW1lbnQsIHRoZW4gYW4gPGNvZGU+YXBwZW5kaXg8L2NvZGU+IHdpdGggdGl0bGUgJ0dsb3NzYXJ5JyBpcyBhZGRlZCB0bwotCSAqIHRoZSBkb2N1bWVudCwgd2l0aCBhIDxjb2RlPmdsb3NzbGlzdDwvY29kZT4gZ2VuZXJhdGVkIGZvciBhbGwgb2YgdGhlIGFjcm9ueW1zIHRoYXQgYXBwZWFyIGluIHRoZSBkb2N1bWVudC4gVGhlCi0JICogZGVmYXVsdCBpcyB0cnVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9tYXRpY0dsb3NzYXJ5KGJvb2xlYW4gYXV0b21hdGljR2xvc3NhcnkpIHsKLQkJdGhpcy5hdXRvbWF0aWNHbG9zc2FyeSA9IGF1dG9tYXRpY0dsb3NzYXJ5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9zbmlwcGV0L1NuaXBwZXRIYW5kbGVyLmphdmEgYi9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL3NuaXBwZXQvU25pcHBldEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4N2Y4ZC4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL3NuaXBwZXQvU25pcHBldEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5kb2NzLnNuaXBwZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlbmFtZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLQotLyoqCi0gKiBVUkxTdHJlYW1IYW5kbGVyIGltcGxlbWVudGF0aW9uIGZvciBoYW5kbGluZyBzbmlwcGV0Oi8vIFVSTAotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldEhhbmRsZXIgZXh0ZW5kcyBVUkxTdHJlYW1IYW5kbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTCA9ICJzbmlwcGV0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gUFJPVE9DT0wgKyAiOi8vIjsKLQotICAgIHByaXZhdGUgQWJzdHJhY3RNb2pvIG1vam87Ci0gICAgcHJpdmF0ZSBGaWxlIGNhY2hlOwotICAgIHByaXZhdGUgVVJMIGJhc2U7Ci0KLSAgICBwdWJsaWMgU25pcHBldEhhbmRsZXIoQWJzdHJhY3RNb2pvIG1vam8sIEZpbGUgY2FjaGUsIFVSTCBiYXNlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubW9qbyA9IG1vam87Ci0gICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKLSAgICAgICAgdGhpcy5iYXNlID0gYmFzZTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKGZpbmFsIFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FjaGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG1vam8uZ2V0TG9nKCkuZGVidWcoIkNyZWF0aW5nIGNhY2hlIGRpcmVjdG9yeSAiICsgY2FjaGUpOwotICAgICAgICAgICAgY2FjaGUubWtkaXJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGdldEZpbGVOYW1lKHVybCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBjYWNoZWQgPSBuZXcgRmlsZShjYWNoZSwgbmFtZSk7Ci0gICAgICAgIGlmICghY2FjaGVkLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBjYWNoZShuYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1vam8uZ2V0TG9nKCkuZGVidWcoIlVzaW5nIGNhY2hlZCBmaWxlICIgKyBjYWNoZWQuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGZvciAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBVUkxDb25uZWN0aW9uKHVybCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIC8vIGdyYWNpb3VzbHkgZG8gbm90aGluZwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihib3MpOwotICAgICAgICAgICAgICAgIG91dC5wcmludGYoIjxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT1cIiVzXCI+PCFbQ0RBVEFbJW4iLCBGaWxlbmFtZVV0aWxzLmdldEV4dGVuc2lvbihuYW1lKSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRRdWVyeSh1cmwsICJpZCIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGNhY2hlZCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29weShpbiwgb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkoaW4sIG91dCwgaWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigibWlzc2luZyBzbmlwcGV0OiAiICsgdXJsKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzdW1tYXJ5IHdhcm5pbmcgbWVzc2FnZSBhbmQgZnVsbCBkZXRhaWwgZGVidWcgbG9nZ2luZwotICAgICAgICAgICAgICAgICAgICBtb2pvLmdldExvZygpLndhcm4oIlVuYWJsZSB0byBpbmNsdWRlIHNuaXBwZXQgIiArIHVybC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbW9qby5nZXRMb2coKS5kZWJ1ZygiVW5hYmxlIHRvIGluY2x1ZGUgc25pcHBldCAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJdXT48L3Byb2dyYW1saXN0aW5nPiIpOwotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOyAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UXVlcnkoVVJMIHVybCwgU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gZ2V0UXVlcnlNYXAodXJsKS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFF1ZXJ5TWFwKFVSTCB1cmwpIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIGlmICh1cmwuZ2V0UXVlcnkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBwYXJhbSA6IHVybC5nZXRRdWVyeSgpLnNwbGl0KCImIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYWlyID0gcGFyYW0uc3BsaXQoIj0iKTsKLSAgICAgICAgICAgICAgICBxdWVyeS5wdXQocGFpclswXSwgcGFpclsxXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcXVlcnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoVVJMIHVybCkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCkuc3Vic3RyaW5nKFBSRUZJWC5sZW5ndGgoKSk7Ci0gICAgICAgIGlmICh1cmwuZ2V0UXVlcnkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgiPyIgKyB1cmwuZ2V0UXVlcnkoKSwgIiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhY2hlKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBVUkwgc291cmNlID0gZ2V0U291cmNlVXJsKG5hbWUpOwotCi0gICAgICAgIEZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoY2FjaGUsIG5hbWUpOwotCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghdGFyZ2V0LmdldFBhcmVudEZpbGUoKS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbW9qby5nZXRMb2coKS5kZWJ1ZygiQ2FjaGluZyAiICsgc291cmNlLnRvRXh0ZXJuYWxGb3JtKCkgKyAiIGluICIgKyB0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgICAgICBpbiA9bmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHNvdXJjZS5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCkpKTsKLSAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcih0YXJnZXQpKTsKLQotICAgICAgICAgICAgY29weShpbiwgb3V0KTsKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBzdW1tYXJ5IHdhcm5pbmcgbWVzc2FnZSBhbmQgZnVsbCBkZXRhaWwgZGVidWcgbWVzc2FnZQotICAgICAgICAgICAgbW9qby5nZXRMb2coKS53YXJuKCJVbmFibGUgdG8gY2FjaGUgZGF0YSBmb3IgIiArIG5hbWUgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIG1vam8uZ2V0TG9nKCkuZGVidWcoIlVuYWJsZSB0byBjYWNoZSBkYXRhIGZvciAiICsgbmFtZSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBVUkwgZ2V0U291cmNlVXJsKFN0cmluZyBuYW1lKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHNvdXJjZTsKLSAgICAgICAgaWYgKGJhc2UudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICBzb3VyY2UgPSBuZXcgVVJMKGJhc2UudG9FeHRlcm5hbEZvcm0oKSArIG5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc291cmNlID0gbmV3IFVSTChiYXNlLnRvRXh0ZXJuYWxGb3JtKCkgKyAiLyIgKyBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc291cmNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb3B5KEJ1ZmZlcmVkUmVhZGVyIGluLCBQcmludFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGlucHV0TGluZTsKLQotICAgICAgICB3aGlsZSAoKGlucHV0TGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGlucHV0TGluZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb3B5KEJ1ZmZlcmVkUmVhZGVyIGluLCBQcmludFdyaXRlciBvdXQsIFN0cmluZyBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmUgPSBpbi5yZWFkTGluZSgpOwotICAgICAgICBib29sZWFuIHNuaXBwZXQgPSBmYWxzZTsKLQotICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc25pcHBldCkgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKCJFTkQgU05JUFBFVDogIiArIGlkKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKCJTVEFSVCBTTklQUEVUOiAiICsgaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNuaXBwZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgbGluZSA9IGluLnJlYWRMaW5lKCk7Ci0gICAgICAgIH0KLQotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL1NuaXBwZXRNb2pvVGVzdC5qYXZhIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9TbmlwcGV0TW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZTcwMy4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL1NuaXBwZXRNb2pvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmRvY3M7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotLyoqCi0gKiBUZXN0IGNhc2VzIGZvciB7QGxpbmsgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmRvY3MuU25pcHBldE1vam99IGFuZCB7QGxpbmsgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmRvY3Muc25pcHBldC5TbmlwcGV0SGFuZGxlcn0KLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXRNb2pvVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTbmlwcGV0TW9qbyBtb2pvOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vam8gPSBuZXcgU25pcHBldE1vam8oKTsKLSAgICAgICAgbW9qby5zbmlwcGV0Q2FjaGUgPSBuZXcgRmlsZSgidGFyZ2V0L3Rlc3RzL3NuaXBwZXRzLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7IAotICAgICAgICBtb2pvLnNuaXBwZXRCYXNlID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcyIpLnRvVVJJKCkudG9VUkwoKTsKLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBnZXRGdWxsU291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoInNuaXBwZXQ6Ly9UZXN0LmphdmEiKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSByZWFkKHVybCkudHJpbSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LnN0YXJ0c1dpdGgoIjxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT1cImphdmFcIj48IVtDREFUQVsiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucygicHVibGljIGNsYXNzIFRlc3QgeyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmVuZHNXaXRoKCJdXT48L3Byb2dyYW1saXN0aW5nPiIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGdldEZ1bGxGcm9tWG1sRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJzbmlwcGV0Oi8vVGVzdC54bWwiKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSByZWFkKHVybCkudHJpbSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoY29udGVudC5zdGFydHNXaXRoKCI8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9XCJ4bWxcIj48IVtDREFUQVsiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucygiPHRlc3QvPiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmVuZHNXaXRoKCJdXT48L3Byb2dyYW1saXN0aW5nPiIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGdldFNuaXBwZXRGcm9tU291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoInNuaXBwZXQ6Ly9UZXN0LmphdmE/aWQ9ZG9Tb21ldGhpbmciKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSByZWFkKHVybCkudHJpbSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoY29udGVudC5zdGFydHNXaXRoKCI8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9XCJqYXZhXCI+PCFbQ0RBVEFbIikpOwotICAgICAgICBhc3NlcnRGYWxzZShjb250ZW50LmNvbnRhaW5zKCJwdWJsaWMgY2xhc3MgVGVzdCB7IikpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoInB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCkgeyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmVuZHNXaXRoKCJdXT48L3Byb2dyYW1saXN0aW5nPiIpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKGNvbnRlbnQuY29udGFpbnMoIjwhLS0gQkVHSU4gU05JUFBFVCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY29udGVudC5jb250YWlucygiPCEtLSBFTkQgU05JUFBFVCIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs0MDk2XTsKLSAgICAgICAgICAgIGludCByZWFkID0gaXMucmVhZChkYXRhKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWFkID4gMCkgewotICAgICAgICAgICAgICAgIGJvcy53cml0ZShkYXRhLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICByZWFkID0gaXMucmVhZChkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvcy5mbHVzaCgpOwotICAgICAgICAgICAgYm9zLmNsb3NlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvQ29uZmx1ZW5jZURvY3VtZW50VGVzdC5qYXZhIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL0NvbmZsdWVuY2VEb2N1bWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViMzVlMC4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvQ29uZmx1ZW5jZURvY3VtZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXguZG9jcy5jb25mbHVlbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7Ci0KLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLS8qKgotICogVGVzdCBjYXNlcyBmb3Ige0BsaW5rIENvbmZsdWVuY2VDb252ZXJ0ZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25mbHVlbmNlRG9jdW1lbnRUZXN0IHsKLQotICAgIEBvcmcuanVuaXQuVGVzdAotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ2hhcHRlckFuZFNlY3Rpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERvY0Jvb2soImRvY3VtZW50MSIpOwotICAgIH0KLQotICAgIEBvcmcuanVuaXQuVGVzdAotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ2hhcHRlclNlY3Rpb25zQW5kUGFyYWdyYXBocygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnREb2NCb29rKCJkb2N1bWVudDIiKTsKLSAgICB9Ci0KLSAgICBAb3JnLmp1bml0LlRlc3QKLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVByb2dyYW1MaXN0aW5nQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RG9jQm9vaygiY29kZS1ibG9ja3MiKTsKLSAgICB9Ci0KLSAgICBAb3JnLmp1bml0LlRlc3QKLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUltYWdlT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERvY0Jvb2soImltYWdlcyIpOwotICAgIH0KLQotICAgIEBvcmcuanVuaXQuVGVzdAotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlTGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RG9jQm9vaygibGlzdHMiKTsKLSAgICB9Ci0KLSAgICBAb3JnLmp1bml0LlRlc3QKLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUxpbmtzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERvY0Jvb2soImxpbmtzIik7Ci0gICAgfQotCi0KLSAgICBAb3JnLmp1bml0LlRlc3QKLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnREb2NCb29rKCJ0YWJsZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RG9jQm9vayhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBJT1V0aWxzLnJlYWRMaW5lcyhnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSArICIueG1sIikpOwotCi0gICAgICAgIENvbmZsdWVuY2VDb252ZXJ0ZXIgZG9jdW1lbnQgPSBuZXcgQ29uZmx1ZW5jZUNvbnZlcnRlcigpOwotCi0gICAgICAgIGRvY3VtZW50LmNvbnZlcnQobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lICsgIi53aWtpIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLQotLy8gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgU3RyaW5nW10gcmVzdWx0cyA9IHdyaXRlci50b1N0cmluZygpLnNwbGl0KCJcXHI/XFxuXFxyPyIpOwotICAgICAgICBpbnQgaSA9IDA7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGluZSAiICsgKGkgKzEpICsgIiBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGVkIERvY0Jvb2sgWE1MIG91dHB1dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLmdldChpKS50cmltKCksIHJlc3VsdC50cmltKCkpOwotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9UZXN0LmphdmEgYi9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjRlNmUzLi4wMDAwMDAwCi0tLSBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQSBzaW1wbGUgVGVzdCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLSAgICAvLyBTVEFSVCBTTklQUEVUOiBkb1NvbWV0aGluZwotICAgIHB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCkgewotICAgICAgICAvLyBkb2VzIHNvbWV0aGluZyB2ZXJ5IGludGVyZXN0aW5nCi0gICAgfQotICAgIC8vIEVORCBTTklQUEVUOiBkb1NvbWV0aGluZwotCi0gICAgcHVibGljIHZvaWQgZG9Tb21ldGhpbmdFbHNlKCkgewotICAgICAgICAvLyBkb2VzIHNvbWV0aGluZyBlbHNlLCBldmVuIG1vcmUgaW50ZXJlc3RpbmcKLSAgICB9Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL1Rlc3QueG1sIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL1Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjg1Mzc5Li4wMDAwMDAwCi0tLSBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9UZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLS0+Ci08dGVzdC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvY29kZS1ibG9ja3Mud2lraSBiL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2NvZGUtYmxvY2tzLndpa2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGMwMzIuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvY29kZS1ibG9ja3Mud2lraQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLWgxLiBDaGFwdGVyCi0KLWgyLiBTZWN0aW9uIDEKLVRoaXMgc2VjdGlvbiBjb250YWlucyBhIHBpZWNlIG9mIHt7Y29kZSB0ZXh0fX0uCi0KLXtjb2RlfQotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08aGVsbG8+Ci0gIDx3b3JsZC8+Ci08L2hlbGxvPgote2NvZGV9Ci0KLWgyLiBTZWN0aW9uIDIKLVRoZSBuZXh0IG9uZSBzcGVjaWZpZXMgdGhlIGxhbmd1YWdlIGZvciB0aGUgY29kZSBibG9jay4KLQote2NvZGU6bGFuZz14bWx9Ci08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxoZWxsbz4KLSAgPHdvcmxkLz4KLTwvaGVsbG8+Ci17Y29kZX0KLQotaDIuIFNlY3Rpb24gd2l0aCB7e2NvZGUgdGV4dH19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvY29kZS1ibG9ja3MueG1sIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvY29kZS1ibG9ja3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDNiMDIyLi4wMDAwMDAwCi0tLSBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2NvZGUtYmxvY2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIgaWQ9IkNoYXB0ZXIiPgotICA8dGl0bGU+Q2hhcHRlcjwvdGl0bGU+Ci0gIDxzZWN0aW9uIGlkPSJTZWN0aW9uMSI+Ci0gICAgPHRpdGxlPlNlY3Rpb24gMTwvdGl0bGU+Ci0gICAgPHBhcmE+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgcGllY2Ugb2YKLSAgICAgIDxsaXRlcmFsPmNvZGUgdGV4dDwvbGl0ZXJhbD4uCi0gICAgPC9wYXJhPgotICAgIDxwcm9ncmFtbGlzdGluZz48IVtDREFUQVsKLSAgICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLSAgICA8aGVsbG8+Ci0gICAgICA8d29ybGQvPgotICAgIDwvaGVsbG8+Ci0gICAgXV0+PC9wcm9ncmFtbGlzdGluZz4KLSAgPC9zZWN0aW9uPgotICA8c2VjdGlvbiBpZD0iU2VjdGlvbjIiPgotICAgIDx0aXRsZT5TZWN0aW9uIDI8L3RpdGxlPgotICAgIDxwYXJhPlRoZSBuZXh0IG9uZSBzcGVjaWZpZXMgdGhlIGxhbmd1YWdlIGZvciB0aGUgY29kZSBibG9jay48L3BhcmE+Ci0gICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPjwhW0NEQVRBWwotICAgIDw/eG1sIHZlcnNpb249IjEuMCI/PgotICAgIDxoZWxsbz4KLSAgICAgIDx3b3JsZC8+Ci0gICAgPC9oZWxsbz4KLSAgICBdXT48L3Byb2dyYW1saXN0aW5nPgotICA8L3NlY3Rpb24+Ci0gIDxzZWN0aW9uIGlkPSJTZWN0aW9ud2l0aGNvZGV0ZXh0Ij4KLSAgICA8dGl0bGU+U2VjdGlvbiB3aXRoCi0gICAgICA8bGl0ZXJhbD5jb2RlIHRleHQ8L2xpdGVyYWw+Ci0gICAgPC90aXRsZT4KLSAgPC9zZWN0aW9uPgotPC9jaGFwdGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2RvY3VtZW50MS53aWtpIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvZG9jdW1lbnQxLndpa2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjQ1YTkuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvZG9jdW1lbnQxLndpa2kKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWgxLiBDaGFwdGVyCi0KLWgyLiBTZWN0aW9uIDEKLQotaDMuIFNlY3Rpb24gMS4xCi0KLWgyLiBTZWN0aW9uIDIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9kb2N1bWVudDEueG1sIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvZG9jdW1lbnQxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0ZjgxZS4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9kb2N1bWVudDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPGNoYXB0ZXIgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIiBpZD0iQ2hhcHRlciI+Ci0gIDx0aXRsZT5DaGFwdGVyPC90aXRsZT4KLSAgPHNlY3Rpb24gaWQ9IlNlY3Rpb24xIj4KLSAgICA8dGl0bGU+U2VjdGlvbiAxPC90aXRsZT4KLSAgICA8c2VjdGlvbiBpZD0iU2VjdGlvbjEuMSI+Ci0gICAgICA8dGl0bGU+U2VjdGlvbiAxLjE8L3RpdGxlPgotICAgIDwvc2VjdGlvbj4KLSAgPC9zZWN0aW9uPgotICA8c2VjdGlvbiBpZD0iU2VjdGlvbjIiPgotICAgIDx0aXRsZT5TZWN0aW9uIDI8L3RpdGxlPgotICA8L3NlY3Rpb24+Ci08L2NoYXB0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvZG9jdW1lbnQyLndpa2kgYi9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9kb2N1bWVudDIud2lraQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2Y2YzOC4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9kb2N1bWVudDIud2lraQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotaDEuIENoYXB0ZXIKLQotaDIuIFNlY3Rpb24gMQotUGFyYWdyYXBoIDEgc3RhcnRzIGhlcmUuLi4KLQotUGFyYWdyYXBoIDIgc3RhcnRzIGhlcmUuLi4KLQotaDMuIFNlY3Rpb24gMS4xCi1BbmQgb25lIG1vcmUgcGFyYWdyYXBoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvZG9jdW1lbnQyLnhtbCBiL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2RvY3VtZW50Mi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzZjMGEuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvZG9jdW1lbnQyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIgaWQ9IkNoYXB0ZXIiPgotICA8dGl0bGU+Q2hhcHRlcjwvdGl0bGU+Ci0gIDxzZWN0aW9uIGlkPSJTZWN0aW9uMSI+Ci0gICAgPHRpdGxlPlNlY3Rpb24gMTwvdGl0bGU+Ci0gICAgPHBhcmE+UGFyYWdyYXBoIDEgc3RhcnRzIGhlcmUuLi48L3BhcmE+Ci0gICAgPHBhcmE+UGFyYWdyYXBoIDIgc3RhcnRzIGhlcmUuLi48L3BhcmE+Ci0gICAgPHNlY3Rpb24gaWQ9IlNlY3Rpb24xLjEiPgotICAgICAgPHRpdGxlPlNlY3Rpb24gMS4xPC90aXRsZT4KLSAgICAgIDxwYXJhPkFuZCBvbmUgbW9yZSBwYXJhZ3JhcGg8L3BhcmE+Ci0gICAgPC9zZWN0aW9uPgotICA8L3NlY3Rpb24+Ci08L2NoYXB0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvaW1hZ2VzLndpa2kgYi9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9pbWFnZXMud2lraQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxNTA5NC4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9pbWFnZXMud2lraQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotaDEuIENoYXB0ZXIKLQotaDIuIFNlY3Rpb24gMQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIGltYWdlCi0KLSFpbWFnZS5wbmchClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvaW1hZ2VzLnhtbCBiL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2ltYWdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTQ5YzEuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvaW1hZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIgaWQ9IkNoYXB0ZXIiPgotICA8dGl0bGU+Q2hhcHRlcjwvdGl0bGU+Ci0gIDxzZWN0aW9uIGlkPSJTZWN0aW9uMSI+Ci0gICAgPHRpdGxlPlNlY3Rpb24gMTwvdGl0bGU+Ci0gICAgPHBhcmE+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIGltYWdlPC9wYXJhPgotICAgIDxwYXJhPgotICAgICAgPG1lZGlhb2JqZWN0PgotICAgICAgICA8aW1hZ2VvYmplY3Q+Ci0gICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWFnZS5wbmciLz4KLSAgICAgICAgPC9pbWFnZW9iamVjdD4KLSAgICAgIDwvbWVkaWFvYmplY3Q+Ci0gICAgPC9wYXJhPgotICA8L3NlY3Rpb24+Ci08L2NoYXB0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvbGlua3Mud2lraSBiL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2xpbmtzLndpa2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Y2ZkYmQuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvbGlua3Mud2lraQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWgxLiBDaGFwdGVyCi0KLXthbmNob3I6TXkgQW5jaG9yfQotCi1oMi4gU2VjdGlvbiAxCi1UaGlzIHNlY3Rpb24gY29udGFpbnMgYSBzaW1wbGUgbGluayB0byBbaHR0cDovL3d3dy5nb29nbGUuYmVdCi0KLWgyLiBTZWN0aW9uIDIKLUNsaWNrIFtoZXJlfGh0dHA6Ly93d3cuZ29vZ2xlLmJlXSB0byBmb2xsb3cgdGhlIGxpbmsgd2l0aCB0ZXh0Ci0KLWgyLiBTZWN0aW9uIDMKLUxpbmtzIGluIGEgdmFyaWFibGUgbGlzdAotLSBzZWFyY2ggcHJvdmlkZXIgOjogW0dvb2dsZXxodHRwOi8vd3d3Lmdvb2dsZS5iZV0gaXMgb2Z0ZW4gdXNlZCBmb3Igc2VhcmNoaW5nIHRoZSB3ZWIKLQotaDIuIFNlY3Rpb24gNAotW0dvb2dsZXxodHRwOi8vd3d3Lmdvb2dsZS5iZV0KLQotaDIuIFNlY3Rpb24gNQotW2h0dHA6Ly93d3cuZ29vZ2xlLmJlXQotCi1oMi4gU2VjdGlvbiA2Ci1bI1NlY3Rpb24gNV0KLQotaDIuIFNlY3Rpb24gNwotWyNNeSBBbmNob3JdCi0KZGlmZiAtLWdpdCBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2xpbmtzLnhtbCBiL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2xpbmtzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzN2VhNi4uMDAwMDAwMAotLS0gYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9saW5rcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08Y2hhcHRlciB4bWxucz0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siIGlkPSJDaGFwdGVyIj4KLSAgPHRpdGxlPkNoYXB0ZXI8L3RpdGxlPgotICA8cGFyYT4KLSAgICAgIDxwaHJhc2UgaWQ9Ik15QW5jaG9yIj48L3BocmFzZT4KLSAgPC9wYXJhPgotICA8c2VjdGlvbiBpZD0iU2VjdGlvbjEiPgotICAgIDx0aXRsZT5TZWN0aW9uIDE8L3RpdGxlPgotICAgIDxwYXJhPlRoaXMgc2VjdGlvbiBjb250YWlucyBhIHNpbXBsZSBsaW5rIHRvCi0gICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cuZ29vZ2xlLmJlIj5odHRwOi8vd3d3Lmdvb2dsZS5iZTwvdWxpbms+Ci0gICAgPC9wYXJhPgotICA8L3NlY3Rpb24+Ci0gIDxzZWN0aW9uIGlkPSJTZWN0aW9uMiI+Ci0gICAgPHRpdGxlPlNlY3Rpb24gMjwvdGl0bGU+Ci0gICAgPHBhcmE+Q2xpY2sKLSAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL3d3dy5nb29nbGUuYmUiPmhlcmU8L3VsaW5rPiB0byBmb2xsb3cgdGhlIGxpbmsgd2l0aCB0ZXh0Ci0gICAgPC9wYXJhPgotICA8L3NlY3Rpb24+Ci0gIDxzZWN0aW9uIGlkPSJTZWN0aW9uMyI+Ci0gICAgPHRpdGxlPlNlY3Rpb24gMzwvdGl0bGU+Ci0gICAgPHBhcmE+TGlua3MgaW4gYSB2YXJpYWJsZSBsaXN0PC9wYXJhPgotICAgICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgICAgPHZhcmxpc3RlbnRyeT4KLSAgICAgICAgICA8dGVybT5zZWFyY2ggcHJvdmlkZXI8L3Rlcm0+Ci0gICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cuZ29vZ2xlLmJlIj5Hb29nbGU8L3VsaW5rPiBpcyBvZnRlbiB1c2VkIGZvciBzZWFyY2hpbmcgdGhlIHdlYgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPC92YXJpYWJsZWxpc3Q+Ci0gIDwvc2VjdGlvbj4gICAgCi0gICAgPHNlY3Rpb24gaWQ9IlNlY3Rpb240Ij4KLSAgICAgIDx0aXRsZT5TZWN0aW9uIDQ8L3RpdGxlPgotICAgICAgPHBhcmE+Ci0gICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cuZ29vZ2xlLmJlIj5Hb29nbGU8L3VsaW5rPgotICAgICAgPC9wYXJhPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBpZD0iU2VjdGlvbjUiPgotICAgICAgPHRpdGxlPlNlY3Rpb24gNTwvdGl0bGU+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL3d3dy5nb29nbGUuYmUiPmh0dHA6Ly93d3cuZ29vZ2xlLmJlPC91bGluaz4KLSAgICAgIDwvcGFyYT4KLSAgICA8L3NlY3Rpb24+Ci0gICAgPHNlY3Rpb24gaWQ9IlNlY3Rpb242Ij4KLSAgICAgICAgPHRpdGxlPlNlY3Rpb24gNjwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPgotICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0iU2VjdGlvbjUiPlNlY3Rpb24gNTwvbGluaz4KLSAgICAgICAgPC9wYXJhPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBpZD0iU2VjdGlvbjciPgotICAgICAgICA8dGl0bGU+U2VjdGlvbiA3PC90aXRsZT4KLSAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICA8bGluayBsaW5rZW5kPSJNeUFuY2hvciI+TXkgQW5jaG9yPC9saW5rPgotICAgICAgICA8L3BhcmE+Ci0gICAgPC9zZWN0aW9uPgotPC9jaGFwdGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2xpc3RzLndpa2kgYi9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9saXN0cy53aWtpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVkNTU3Li4wMDAwMDAwCi0tLSBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL2xpc3RzLndpa2kKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1oMS4gQ2hhcHRlcgotCi1oMi4gU2VjdGlvbiAxCi1UaGlzIHNlY3Rpb24gY29udGFpbnMgYSBidWxsZXRlZCBsaXN0OgotKiBpdGVtIDEKLSoge3tpdGVtIDJ9fQotKiBpdGVtIDMKLQotaDIuIFNlY3Rpb24gMgotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgbnVtYmVyZWQgbGlzdDoKLSMgaXRlbSAxCi0jIHt7aXRlbSAyfX0KLSMgaXRlbSAzCi0KLWgyLiBWYXJpYWJsZSBsaXN0Ci1UaGlzIHNlY3Rpb24gY29udGFpbnMgYSB2YXJpYWJsZSBsaXN0OgotLSB0ZXJtMSA6OiBEZWZpbml0aW9uIGZvciB0ZXJtMQotLSB7e3Rlcm0yfX0gOjogRGVmaW5pdGlvbiBmb3IgdGVybTIgKGluY2x1ZGluZyB7e2NvZGUgdGV4dH19KQotLSB0ZXJtMyA6OiBEZWZpbml0aW9uIGZvciB0ZXJtMwotCmRpZmYgLS1naXQgYS9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9saXN0cy54bWwgYi9kb2NzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2RvY3MvY29uZmx1ZW5jZS9saXN0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDE3Y2YuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvbGlzdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPGNoYXB0ZXIgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIiBpZD0iQ2hhcHRlciI+Ci0gIDx0aXRsZT5DaGFwdGVyPC90aXRsZT4KLSAgPHNlY3Rpb24gaWQ9IlNlY3Rpb24xIj4KLSAgICA8dGl0bGU+U2VjdGlvbiAxPC90aXRsZT4KLSAgICA8cGFyYT5UaGlzIHNlY3Rpb24gY29udGFpbnMgYSBidWxsZXRlZCBsaXN0OjwvcGFyYT4KLSAgICAgIDxpdGVtaXplZGxpc3Q+Ci0gICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICA8cGFyYT5pdGVtIDE8L3BhcmE+Ci0gICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgPGxpdGVyYWw+aXRlbSAyPC9saXRlcmFsPgotICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgIDxwYXJhPml0ZW0gMzwvcGFyYT4KLSAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgIDwvaXRlbWl6ZWRsaXN0PgotICA8L3NlY3Rpb24+Ci0gIDxzZWN0aW9uIGlkPSJTZWN0aW9uMiI+Ci0gICAgPHRpdGxlPlNlY3Rpb24gMjwvdGl0bGU+Ci0gICAgPHBhcmE+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgbnVtYmVyZWQgbGlzdDo8L3BhcmE+Ci0gICAgICA8b3JkZXJlZGxpc3Q+Ci0gICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICA8cGFyYT5pdGVtIDE8L3BhcmE+Ci0gICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgPGxpdGVyYWw+aXRlbSAyPC9saXRlcmFsPgotICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgIDxwYXJhPml0ZW0gMzwvcGFyYT4KLSAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgIDwvb3JkZXJlZGxpc3Q+Ci0gIDwvc2VjdGlvbj4KLSAgPHNlY3Rpb24gaWQ9IlZhcmlhYmxlbGlzdCI+Ci0gICAgPHRpdGxlPlZhcmlhYmxlIGxpc3Q8L3RpdGxlPgotICAgIDxwYXJhPlRoaXMgc2VjdGlvbiBjb250YWlucyBhIHZhcmlhYmxlIGxpc3Q6PC9wYXJhPgotICAgICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgICAgPHZhcmxpc3RlbnRyeT4KLSAgICAgICAgICA8dGVybT50ZXJtMTwvdGVybT4KLSAgICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICA8cGFyYT5EZWZpbml0aW9uIGZvciB0ZXJtMTwvcGFyYT4KLSAgICAgICAgICA8L2xpc3RpdGVtPgotICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgICAgPHZhcmxpc3RlbnRyeT4KLSAgICAgICAgICA8dGVybT4KLSAgICAgICAgICAgIDxsaXRlcmFsPnRlcm0yPC9saXRlcmFsPgotICAgICAgICAgIDwvdGVybT4KLSAgICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICA8cGFyYT5EZWZpbml0aW9uIGZvciB0ZXJtMiAoaW5jbHVkaW5nCi0gICAgICAgICAgICAgIDxsaXRlcmFsPmNvZGUgdGV4dDwvbGl0ZXJhbD4pCi0gICAgICAgICAgICA8L3BhcmE+Ci0gICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICAgIDx2YXJsaXN0ZW50cnk+Ci0gICAgICAgICAgPHRlcm0+dGVybTM8L3Rlcm0+Ci0gICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgPHBhcmE+RGVmaW5pdGlvbiBmb3IgdGVybTM8L3BhcmE+Ci0gICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8L3ZhcmlhYmxlbGlzdD4KLSAgPC9zZWN0aW9uPgotPC9jaGFwdGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL3RhYmxlcy53aWtpIGIvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvdGFibGVzLndpa2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNmZkNTMuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvdGFibGVzLndpa2kKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWgxLiBDaGFwdGVyCi0KLWgyLiBBbiBpbmZvcm1hbCB0YWJsZQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIGluZm9ybWFsIHRhYmxlOgotfHwgSGVhZGVyIDEgfHwgSGVhZGVyIDIgfHwgSGVhZGVyIDMgfHwKLXwgVmFsIDEuMSB8IFZhbCAxLjIgfCB7e1ZhbCAxLjN9fSB8Ci18IFZhbCAyLjEgfCBWYWwgMi4yIHwge3tWYWwgMi4zfX0gfApkaWZmIC0tZ2l0IGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvdGFibGVzLnhtbCBiL2RvY3MtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvZG9jcy9jb25mbHVlbmNlL3RhYmxlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDc4YmIuLjAwMDAwMDAKLS0tIGEvZG9jcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc2VydmljZW1peC9kb2NzL2NvbmZsdWVuY2UvdGFibGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIgaWQ9IkNoYXB0ZXIiPgotICA8dGl0bGU+Q2hhcHRlcjwvdGl0bGU+Ci0gIDxzZWN0aW9uIGlkPSJBbmluZm9ybWFsdGFibGUiPgotICAgIDx0aXRsZT5BbiBpbmZvcm1hbCB0YWJsZTwvdGl0bGU+Ci0gICAgPHBhcmE+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIGluZm9ybWFsIHRhYmxlOjwvcGFyYT4KLSAgICAgIDxpbmZvcm1hbHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5IZWFkZXIgMTwvdGg+Ci0gICAgICAgICAgICA8dGg+SGVhZGVyIDI8L3RoPgotICAgICAgICAgICAgPHRoPkhlYWRlciAzPC90aD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD5WYWwgMS4xPC90ZD4KLSAgICAgICAgICAgIDx0ZD5WYWwgMS4yPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8bGl0ZXJhbD5WYWwgMS4zPC9saXRlcmFsPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD5WYWwgMi4xPC90ZD4KLSAgICAgICAgICAgIDx0ZD5WYWwgMi4yPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8bGl0ZXJhbD5WYWwgMi4zPC9saXRlcmFsPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgPC9pbmZvcm1hbHRhYmxlPgotICA8L3NlY3Rpb24+Ci08L2NoYXB0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL0xJQ0VOU0UgYi9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vTk9USUNFIGIvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyMTJjNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICA9PSAgTk9USUNFIGZpbGUgZm9yIHVzZSB3aXRoIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgID09Ci0gICA9PSAgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIFNlcnZpY2VNaXggZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgID09Ci0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFRoaXMgcHJvZHVjdCBjb250YWlucyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3MTNkOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQk8IS0tCi0JCUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotCQljb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotCQl0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0JCVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KLQkJMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotCQl3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieQotCQlhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0JCUxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi0JCUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IKLQkJdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0JCUxpY2Vuc2UuCi0JLS0+Ci0JPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2lucy1wb208L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zPC92ZXJzaW9uPgotICAgICAgPHJlbGF0aXZlUGF0aD4uLi9tYXZlbi1wbHVnaW5zLXBvbS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+ICAgICAgCi0gICAgPC9wYXJlbnQ+Ci0KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmZlYXR1cmVzLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICAgIDx2ZXJzaW9uPjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8bmFtZT5BcGFjaGUgU2VydmljZU1peCA6OiBQbHVnaW5zIDo6IE1hdmVuMiBGZWF0dXJlcyBwbHVnaW48L25hbWU+Ci0KLSAgICA8c2NtPgotICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NlcnZpY2VtaXgvbWF2ZW4tcGx1Z2lucy9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vdHJ1bms8L2Nvbm5lY3Rpb24+Ci0gICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NlcnZpY2VtaXgvbWF2ZW4tcGx1Z2lucy9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vdHJ1bms8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9zZXJ2aWNlbWl4L21hdmVuLXBsdWdpbnMvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3RydW5rPC91cmw+Ci0gICAgPC9zY20+Ci0KLQk8ZGVwZW5kZW5jaWVzPgotCQk8ZGVwZW5kZW5jeT4KLQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0JCQk8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotCQkJPHZlcnNpb24+Mi4wLjk8L3ZlcnNpb24+Ci0JCTwvZGVwZW5kZW5jeT4KLQkJPGRlcGVuZGVuY3k+Ci0JCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotCQkJPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQkJCTx2ZXJzaW9uPjIuMC45PC92ZXJzaW9uPgotCQk8L2RlcGVuZGVuY3k+Ci0JCTxkZXBlbmRlbmN5PgotCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLQkJCTxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0JCQk8dmVyc2lvbj4xLjQuMzwvdmVyc2lvbj4KLQkJPC9kZXBlbmRlbmN5PgotCQk8ZGVwZW5kZW5jeT4KLQkJICAgIDxncm91cElkPm9yZy5qbW9jazwvZ3JvdXBJZD4KLQkJCTxhcnRpZmFjdElkPmptb2NrPC9hcnRpZmFjdElkPgotCQkJPHZlcnNpb24+Mi41LjA8L3ZlcnNpb24+Ci0JCQk8c2NvcGU+dGVzdDwvc2NvcGU+Ci0JCTwvZGVwZW5kZW5jeT4KLQk8L2RlcGVuZGVuY2llcz4KLQotICAgICAgIDxwcm9maWxlcz4KLSAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIHdhbnQgdG8gZGVwbG95IHRoZSBhcnRpZmFjdCB0byBhIHN0YWdpbmcgbG9jYXRpb24gZm9yIHBlcnVzYWwgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWx0RGVwbG95bWVudFJlcG9zaXRvcnk+JHtkZXBsb3kuYWx0UmVwb3NpdG9yeX08L2FsdERlcGxveW1lbnRSZXBvc2l0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cGRhdGVSZWxlYXNlSW5mbz50cnVlPC91cGRhdGVSZWxlYXNlSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gV2Ugd2FudCB0byBzaWduIHRoZSBhcnRpZmFjdCwgdGhlIFBPTSwgYW5kIGFsbCBhdHRhY2hlZCBhcnRpZmFjdHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFzc3BocmFzZT4ke2dwZy5wYXNzcGhyYXNlfTwvcGFzc3BocmFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpZ248L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+ZGVwbG95PC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8ZGVmYXVsdEdvYWw+ZGVwbG95PC9kZWZhdWx0R29hbD4KLSAgICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0YWNoPnRydWU8L2F0dGFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF0dGFjaD50cnVlPC9hdHRhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgIDwvcHJvZmlsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9BZGRGZWF0dXJlc1RvUmVwb01vam8uamF2YSBiL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC90b29saW5nL2ZlYXR1cmVzL0FkZEZlYXR1cmVzVG9SZXBvTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODA2YzA2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC90b29saW5nL2ZlYXR1cmVzL0FkZEZlYXR1cmVzVG9SZXBvTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmcuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkRlZmF1bHRBcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuRGVmYXVsdEFydGlmYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGZlYXR1cmVzIFhNTCBmaWxlCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAotICogQGdvYWwgYWRkLWZlYXR1cmVzLXRvLXJlcG8KLSAqIEBwaGFzZSBjb21waWxlCi0gKiBAZXhlY3V0ZSBwaGFzZT0iY29tcGlsZSIKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqIEBpbmhlcml0QnlEZWZhdWx0IHRydWUKLSAqIEBkZXNjcmlwdGlvbiBBZGQgdGhlIGZlYXR1cmVzIHRvIHRoZSByZXBvc2l0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBZGRGZWF0dXJlc1RvUmVwb01vam8gZXh0ZW5kcyBNb2pvU3VwcG9ydCB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVzY3JpcHRvcnM7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmVhdHVyZXM7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHJlcG9zaXRvcnk7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEZlYXR1cmU+IGZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGZWF0dXJlPigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdXJpIDogZGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgICAgICBSZXBvc2l0b3J5IHJlcG8gPSBuZXcgUmVwb3NpdG9yeShVUkkuY3JlYXRlKHRyYW5zbGF0ZUZyb21NYXZlbih1cmkpKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChGZWF0dXJlIGYgOiByZXBvLmdldEZlYXR1cmVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNNYXAucHV0KGYuZ2V0TmFtZSgpLCBmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiB0cmFuc2l0aXZlRmVhdHVyZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBhZGRGZWF0dXJlcyhmZWF0dXJlcywgdHJhbnNpdGl2ZUZlYXR1cmVzLCBmZWF0dXJlc01hcCk7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBidW5kbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgZmVhdHVyZSA6IHRyYW5zaXRpdmVGZWF0dXJlcykgewotICAgICAgICAgICAgICAgIGJ1bmRsZXMuYWRkQWxsKGZlYXR1cmVzTWFwLmdldChmZWF0dXJlKS5nZXRCdW5kbGVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCYXNlIHJlcG86ICIgKyBsb2NhbFJlcG8uZ2V0VXJsKCkpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgYnVuZGxlIDogYnVuZGxlcykgewotICAgICAgICAgICAgICAgIGlmICghYnVuZGxlLnN0YXJ0c1dpdGgoIm12bjoiKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiQnVuZGxlIHVybCBpcyBub3QgYSBtYXZlbiB1cmw6ICIgKyBidW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGJ1bmRsZS5zdWJzdHJpbmcoIm12bjoiLmxlbmd0aCgpKS5zcGxpdCgiLyIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBncm91cElkID0gcGFydHNbMF07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFydGlmYWN0SWQgPSBwYXJ0c1sxXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzaWZpZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gImphciI7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHBhcnRzWzJdOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmllciA9IHBhcnRzWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gcGFydHNbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpciA9IGdyb3VwSWQucmVwbGFjZSgnLicsICcvJykgKyAiLyIgKyBhcnRpZmFjdElkICsgIi8iICsgdmVyc2lvbiArICIvIjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGFydGlmYWN0SWQgKyAiLSIgKyB2ZXJzaW9uICsgKGNsYXNzaWZpZXIgIT0gbnVsbCA/ICItIiArIGNsYXNzaWZpZXIgOiAiIikgKyAiLiIgKyB0eXBlOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29weTogICAgICAiICsgZGlyICsgbmFtZSk7Ci0gICAgICAgICAgICAgICAgY29weShuZXcgVVJMKGdldExvY2FsUmVwb1VybCgpICsgIi8iICsgZGlyICsgbmFtZSkub3BlblN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBkaXIsCi0gICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVs4MTkyXSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChNb2pvRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIHBvcHVsYXRpbmcgcmVwb3NpdG9yeSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJhbnNsYXRlRnJvbU1hdmVuKFN0cmluZyB1cmkpIHsKLSAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCJtdm46IikpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gdXJpLnN1YnN0cmluZygibXZuOiIubGVuZ3RoKCkpLnNwbGl0KCIvIik7Ci0gICAgICAgICAgICBTdHJpbmcgZ3JvdXBJZCA9IHBhcnRzWzBdOwotICAgICAgICAgICAgU3RyaW5nIGFydGlmYWN0SWQgPSBwYXJ0c1sxXTsKLSAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc2lmaWVyID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlID0gImphciI7Ci0gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgIHZlcnNpb24gPSBwYXJ0c1syXTsKLSAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMykgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gcGFydHNbM107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWVyID0gcGFydHNbNF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgZGlyID0gZ3JvdXBJZC5yZXBsYWNlKCcuJywgJy8nKSArICIvIiArIGFydGlmYWN0SWQgKyAiLyIgKyB2ZXJzaW9uICsgIi8iOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhcnRpZmFjdElkICsgIi0iICsgdmVyc2lvbiArIChjbGFzc2lmaWVyICE9IG51bGwgPyAiLSIgKyBjbGFzc2lmaWVyIDogIiIpICsgIi4iICsgdHlwZTsKLQotICAgICAgICAgICAgcmV0dXJuIGdldExvY2FsUmVwb1VybCgpICsgIi8iICsgZGlyICsgbmFtZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiV2luZG93cyIpICYmIHVyaS5zdGFydHNXaXRoKCJmaWxlOiIpKSB7Ci0gICAgICAgIAlTdHJpbmcgYmFzZURpciA9IHVyaS5zdWJzdHJpbmcoNSkucmVwbGFjZSgnXFwnLCAnLycpLnJlcGxhY2VBbGwoIiAiLCAiJTIwIik7Ci0gICAgICAgIAlTdHJpbmcgcmVzdWx0ID0gYmFzZURpcjsKLSAgICAgICAgCWlmIChiYXNlRGlyLmluZGV4T2YoIjoiKSA+IDApIHsKLSAgICAgICAgCQlyZXN1bHQgPSAiZmlsZTovLy8iICsgYmFzZURpcjsKLSAgICAgICAgCX0KLSAgICAgICAgCXJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMb2NhbFJlcG9VcmwoKSB7Ci0gICAgCSBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiV2luZG93cyIpKSB7Ci0gICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBsb2NhbFJlcG8uZ2V0QmFzZWRpcigpLnJlcGxhY2UoJ1xcJywgJy8nKS5yZXBsYWNlQWxsKCIgIiwgIiUyMCIpOwotICAgICAgICAgICAgIHJldHVybiBsb2NhbFJlcG8uZ2V0UHJvdG9jb2woKSArICI6Ly8vIiArIGJhc2VEaXI7Ci0gICAgCSB9IGVsc2UgewotICAgIAkJIHJldHVybiBsb2NhbFJlcG8uZ2V0VXJsKCk7Ci0gICAgCSB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEZlYXR1cmVzKExpc3Q8U3RyaW5nPiBmZWF0dXJlcywgU2V0PFN0cmluZz4gdHJhbnNpdGl2ZUZlYXR1cmVzLCBNYXA8U3RyaW5nLCBGZWF0dXJlPiBmZWF0dXJlc01hcCkgewotICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlIDogZmVhdHVyZXMpIHsKLSAgICAgICAgICAgIEZlYXR1cmUgZiA9IGZlYXR1cmVzTWFwLmdldChmZWF0dXJlKTsKLSAgICAgICAgICAgIHRyYW5zaXRpdmVGZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0gICAgICAgICAgICBhZGRGZWF0dXJlcyhmLmdldERlcGVuZGVuY2llcygpLCB0cmFuc2l0aXZlRmVhdHVyZXMsIGZlYXR1cmVzTWFwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KAotICAgICAgICBJbnB1dFN0cmVhbSBpcywgRmlsZSBkaXIsIFN0cmluZyBkZXN0TmFtZSwgU3RyaW5nIGRlc3REaXIsIGJ5dGVbXSBidWZmZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGRlc3REaXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVzdERpciA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGV4aXN0cyBhbmQKLSAgICAgICAgLy8gdGhhdCBpcyBhY3R1YWxseSBhIGRpcmVjdG9yeS4KLSAgICAgICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShkaXIsIGRlc3REaXIpOwotICAgICAgICBpZiAoIXRhcmdldERpci5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF0YXJnZXREaXIubWtkaXJzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIHRhcmdldCBkaXJlY3Rvcnk6ICIKLSAgICAgICAgICAgICAgICAgICAgKyB0YXJnZXREaXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCF0YXJnZXREaXIuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUYXJnZXQgaXMgbm90IGEgZGlyZWN0b3J5OiAiCi0gICAgICAgICAgICAgICAgKyB0YXJnZXREaXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUodGFyZ2V0RGlyLCBkZXN0TmFtZSkpKTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKChjb3VudCA9IGlzLnJlYWQoYnVmZmVyKSkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBib3Mud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9zLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGZWF0dXJlIHsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsU3RyaW5nPj4gY29uZmlncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZyxTdHJpbmc+PigpOwotCi0gICAgICAgIHB1YmxpYyBGZWF0dXJlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldERlcGVuZGVuY2llcygpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEJ1bmRsZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiBnZXRDb25maWd1cmF0aW9ucygpIHsKLSAgICAgICAgICAgIHJldHVybiBjb25maWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVwZW5kZW5jeShTdHJpbmcgZGVwZW5kZW5jeSkgewotICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEJ1bmRsZShTdHJpbmcgYnVuZGxlKSB7Ci0gICAgICAgICAgICBidW5kbGVzLmFkZChidW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlnKFN0cmluZyBuYW1lLCBNYXA8U3RyaW5nLFN0cmluZz4gcHJvcGVydGllcykgewotICAgICAgICAgICAgY29uZmlncy5wdXQobmFtZSwgcHJvcGVydGllcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcG9zaXRvcnkgewotCi0gICAgICAgIHByaXZhdGUgVVJJIHVyaTsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PEZlYXR1cmU+IGZlYXR1cmVzOwotCi0gICAgICAgIHB1YmxpYyBSZXBvc2l0b3J5KFVSSSB1cmkpIHsKLSAgICAgICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZlYXR1cmVbXSBnZXRGZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2FkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmVhdHVyZXMudG9BcnJheShuZXcgRmVhdHVyZVtmZWF0dXJlcy5zaXplKCldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RmVhdHVyZT4oKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZSh1cmkudG9VUkwoKS5vcGVuU3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIE5vZGVMaXN0IG5vZGVzID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHx8ICEiZmVhdHVyZSIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgIEZlYXR1cmUgZiA9IG5ldyBGZWF0dXJlKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBmZWF0dXJlTm9kZXMgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmZWF0dXJlIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmVhdHVyZU5vZGVzLmdldExlbmd0aCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgYiA9IChFbGVtZW50KSBmZWF0dXJlTm9kZXMuaXRlbShqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuYWRkRGVwZW5kZW5jeShiLmdldFRleHRDb250ZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IGNvbmZpZ05vZGVzID0gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY29uZmlnIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnTm9kZXMuZ2V0TGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBjID0gKEVsZW1lbnQpIGNvbmZpZ05vZGVzLml0ZW0oaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2ZnTmFtZSA9IGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IGMuZ2V0VGV4dENvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3Qga2V5IDogcHJvcGVydGllcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuID0ga2V5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlLnB1dChuLCBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KG4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGYuYWRkQ29uZmlnKGNmZ05hbWUsIGhhc2h0YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgYnVuZGxlTm9kZXMgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJidW5kbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBidW5kbGVOb2Rlcy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGIgPSAoRWxlbWVudCkgYnVuZGxlTm9kZXMuaXRlbShqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuYWRkQnVuZGxlKGIuZ2V0VGV4dENvbnRlbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMuYWRkKGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L3Rvb2xpbmcvZmVhdHVyZXMvR2VuZXJhdGVGZWF0dXJlc0ZpbGVNb2pvLmphdmEgYi9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9HZW5lcmF0ZUZlYXR1cmVzRmlsZU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmMTg4ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9HZW5lcmF0ZUZlYXR1cmVzRmlsZU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuSW52YWxpZEFydGlmYWN0UlRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5tZXRhZGF0YS5BcnRpZmFjdE1ldGFkYXRhUmV0cmlldmFsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWV0YWRhdGEuUmVzb2x1dGlvbkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuQXJ0aWZhY3RWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5JbnZhbGlkVmVyc2lvblNwZWNpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLk92ZXJDb25zdHJhaW5lZFZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLkRlcGVuZGVuY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5pbXBsLmJ1bmRsZS5vYnIucmVzb3VyY2UuTWFuaWZlc3Q7Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBmZWF0dXJlcyBYTUwgZmlsZQotICogCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCi0gKiBAZ29hbCBnZW5lcmF0ZS1mZWF0dXJlcy1maWxlCi0gKiBAcGhhc2UgY29tcGlsZQotICogQGV4ZWN1dGUgcGhhc2U9ImNvbXBpbGUiCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKiBAaW5oZXJpdEJ5RGVmYXVsdCB0cnVlCi0gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIHRoZSBmZWF0dXJlcyBYTUwgZmlsZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUZlYXR1cmVzRmlsZU1vam8gZXh0ZW5kcyBNb2pvU3VwcG9ydCB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIi8iOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGUgdG8gZ2VuZXJhdGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXMvZmVhdHVyZS54bWwiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dEZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIGFydGlmYWN0IElEIGlmIGl0cyBub3QKLSAgICAgKiBzcGVjaWZpZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5hcnRpZmFjdElkfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmZWF0dXJlTmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBhcnRpZmFjdCB0eXBlIGZvciBhdHRhY2hpbmcgdGhlIGdlbmVyYXRlZCBmaWxlIHRvIHRoZSBwcm9qZWN0Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ4bWwiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXR0YWNobWVudEFydGlmYWN0VHlwZSA9ICJ4bWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGFydGlmYWN0IGNsYXNzaWZpZXIgZm9yIGF0dGFjaGluZyB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8gdGhlIHByb2plY3QKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImZlYXR1cmVzIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGF0dGFjaG1lbnRBcnRpZmFjdENsYXNzaWZpZXIgPSAiZmVhdHVyZXMiOwotCi0gICAgLyoqCi0gICAgICogU2hvdWxkIHdlIGdlbmVyYXRlIGEgPGZlYXR1cmU+IGZvciB0aGUgY3VycmVudCBwcm9qZWN0PwotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVQcm9qZWN0ID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgd2UgZ2VuZXJhdGUgYSA8ZmVhdHVyZT4gZm9yIHRoZSBjdXJyZW50IHByb2plY3QncyA8ZGVwZW5kZW5jeT5zPwotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGtlcm5lbCB2ZXJzaW9uIGZvciB3aGljaCB0byBnZW5lcmF0ZSB0aGUgYnVuZGxlCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGtlcm5lbFZlcnNpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBwcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZyBidW5kbGUgdHJhbnNsYXRpb25zCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSB0cmFuc2xhdGlvbjsKLSAgICAKLSAgICAvKgotICAgICAqIFRoZSB0cmFuc2xhdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxWZXJzaW9uUmFuZ2UsIFN0cmluZz4+IHRyYW5zbGF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFZlcnNpb25SYW5nZSxTdHJpbmc+PigpIHsKLSAgICAJQE92ZXJyaWRlCi0gICAgCXB1YmxpYyBNYXA8VmVyc2lvblJhbmdlLCBTdHJpbmc+IGdldChPYmplY3Qga2V5KSB7Ci0gICAgCQlpZiAoc3VwZXIuZ2V0KGtleSkgPT0gbnVsbCkgewotICAgIAkJCXN1cGVyLnB1dChrZXkudG9TdHJpbmcoKSwgbmV3IEhhc2hNYXA8VmVyc2lvblJhbmdlLCBTdHJpbmc+KCkpOwotICAgIAkJfQotICAgIAkJcmV0dXJuIHN1cGVyLmdldChrZXkpOwotICAgIAl9Ci0gICAgfTsKLSAgICAKLSAgICAvKgotICAgICAqIFRoZXNlIGJ1bmRsZXMgYXJlIHRoZSBmZWF0dXJlcyB0aGF0IHdpbGwgYmUgYnVpbHQKLSAgICAgKi8KLSAgICBwcml2YXRlIFNldDxBcnRpZmFjdD4gZmVhdHVyZXMgPSBuZXcgSGFzaFNldDxBcnRpZmFjdD4oKTsKLQotICAgIC8qCi0gICAgICogVGhlc2UgYnVuZGxlcyBhcmUgcHJvdmlkZWQgYnkgU01YNCBhbmQgd2lsbCBiZSBleGNsdWRlZCBmcm9tIDxmZWF0dXJlLz4KLSAgICAgKiBnZW5lcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXQ8QXJ0aWZhY3Q+IHByb3ZpZGVkID0gbmV3IEhhc2hTZXQ8QXJ0aWZhY3Q+KCk7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBMaXN0IG9mIGJ1bmRsZXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgZmVhdHVyZQotICAgICAqLwotICAgIHByaXZhdGUgU2V0PEFydGlmYWN0PiBjdXJyZW50RmVhdHVyZSA9IG5ldyBIYXNoU2V0PEFydGlmYWN0PigpOwotICAgIAotICAgIC8qCi0gICAgICogTGlzdCBvZiBtaXNzaW5nIGJ1bmRsZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFNldDxBcnRpZmFjdD4gbWlzc2luZ0J1bmRsZXMgPSBuZXcgVHJlZVNldDxBcnRpZmFjdD4oKTsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCXByZXBhcmUoKTsKLSAgICAgICAgCWdldExvZygpLmluZm8oU3RyaW5nLmZvcm1hdCgiLS0gU3RhcnQgZ2VuZXJhdGluZyAlcyAtLSIsIG91dHB1dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgIG91dHB1dEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFByaW50U3RyZWFtIHByaW50ZXIgPSBuZXcgUHJpbnRTdHJlYW0ob3V0KTsKLSAgICAgICAgICAgIHBvcHVsYXRlUHJvcGVydGllcyhwcmludGVyKTsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oU3RyaW5nLmZvcm1hdCgiLS0gRG9uZSBnZW5lcmF0aW5nICVzIC0tIiwgb3V0cHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCi0gICAgICAgICAgICAvLyBub3cgbGV0cyBhdHRhY2ggaXQKLSAgICAgICAgICAgIHByb2plY3RIZWxwZXIuYXR0YWNoQXJ0aWZhY3QocHJvamVjdCwgYXR0YWNobWVudEFydGlmYWN0VHlwZSwgYXR0YWNobWVudEFydGlmYWN0Q2xhc3NpZmllciwgb3V0cHV0RmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBkZXBlbmRlbmNpZXMgZmlsZTogIiArIGUsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJGYWlsZWQgdG8gY2xvc2U6ICIgKyBvdXRwdXRGaWxlICsgIi4gUmVhc29uOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQcm9wZXJ0aWVzKFByaW50U3RyZWFtIG91dCkgdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiwgQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCI8ZmVhdHVyZXM+Iik7Ci0gICAgICAgIGlmIChpbmNsdWRlUHJvamVjdCkgewotICAgICAgICAgICAgd3JpdGVDdXJyZW50UHJvamVjdEZlYXR1cmUob3V0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykgewotICAgICAgICAgICAgd3JpdGVQcm9qZWN0RGVwZW5kZW5jeUZlYXR1cmVzKG91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnByaW50bG4oIjwvZmVhdHVyZXM+Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmUoKSB0aHJvd3MgQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uLCBBcnRpZmFjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSW52YWxpZFZlcnNpb25TcGVjaWZpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJaWYgKHRyYW5zbGF0aW9uICE9IG51bGwpIHsKLSAgICAJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgCQl0cnkgewotICAgIAkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0odHJhbnNsYXRpb24pKTsKLSAgICAJCQlQcm9wZXJ0aWVzIGZpbGUgPSBuZXcgUHJvcGVydGllcygpOwotICAgIAkJCWZpbGUubG9hZChzdHJlYW0pOwotICAgIAkJCUFycmF5TGlzdDxTdHJpbmc+IHN0cmluZ05hbWVzID0gZ2V0U3RyaW5nTmFtZXMoZmlsZSk7Ci0gICAgCQkJZm9yIChTdHJpbmcga2V5IDogc3RyaW5nTmFtZXMpIHsKLSAgICAJCQkJU3RyaW5nW10gZWxlbWVudHMgPSBrZXkuc3BsaXQoIi8iKTsKLSAgICAJCQkJdHJhbnNsYXRpb25zLmdldChTdHJpbmcuZm9ybWF0KCIlcy8lcyIsIGVsZW1lbnRzWzBdLCBlbGVtZW50c1sxXSkpCi0gICAgCQkJCSAgICAgICAgICAgIC5wdXQoVmVyc2lvblJhbmdlLmNyZWF0ZUZyb21WZXJzaW9uU3BlYyhlbGVtZW50c1syXSksIGZpbGUuZ2V0UHJvcGVydHkoa2V5KSk7Ci0gICAgCQkJfQotICAgIAkJCWdldExvZygpLmluZm8oIkxvYWRlZCAiICsgdHJhbnNsYXRpb25zLnNpemUoKSArICIgYnVuZGxlIG5hbWUgdHJhbnNsYXRpb24gcnVsZXMgZnJvbSAiICsgdHJhbnNsYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIAkJfSBmaW5hbGx5IHsKLSAgICAJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAJCQkJc3RyZWFtLmNsb3NlKCk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCQotICAgIAlBcnRpZmFjdCBrZXJuZWwgPSBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0KCJvcmcuYXBhY2hlLnNlcnZpY2VtaXgua2VybmVsIiwgCi0gICAgCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwYWNoZS1zZXJ2aWNlbWl4LWtlcm5lbCIsCi0gICAgCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsVmVyc2lvbiwgQXJ0aWZhY3QuU0NPUEVfUFJPVklERUQsICJwb20iKTsKLSAgICAJcmVzb2x2ZXIucmVzb2x2ZShrZXJuZWwsIHJlbW90ZVJlcG9zLCBsb2NhbFJlcG8pOwotICAgIAlnZXRMb2coKS5pbmZvKCItLSBMaXN0IG9mIGJ1bmRsZXMgcHJvdmlkZWQgYnkgU2VydmljZU1peCBLZXJuZWwgIiArIGtlcm5lbFZlcnNpb24gKyAiIC0tIik7Ci0gICAgICAgIGZvciAoQXJ0aWZhY3QgYXJ0aWZhY3QgOiBnZXREZXBlbmRlbmNpZXMoa2VybmVsKSkgewotICAgICAgICAJZ2V0TG9nKCkuaW5mbygiICIgKyBhcnRpZmFjdCk7Ci0gICAgICAgICAgICBwcm92aWRlZC5hZGQoYXJ0aWZhY3QpOwotICAgICAgICB9Ci0gICAgICAgIGdldExvZygpLmluZm8oIi0tIDxlbmQgb2YgbGlzdD4gIC0tIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBnZXRTdHJpbmdOYW1lcyhQcm9wZXJ0aWVzIGZpbGUpIHsKLSAgICAJLy8gdGhpcyBtZXRob2Qgc2ltdWxhdGUgdGhlIFByb3BlcnRpZXMuc3RyaW5nUHJvcGVydHlOYW1lcygpIG9mIEpESzYgaW4gb3JkZXIgdG8gbWFrZSB0aGlzIGNsYXNzIAotICAgIAkvLyBjb21waWxlIHdpdGggamRrNQotICAgIAlBcnJheUxpc3Q8U3RyaW5nPiByZXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAJRW51bWVyYXRpb248Pz4gbmFtZSA9IGZpbGUucHJvcGVydHlOYW1lcygpOwotICAgIAl3aGlsZSAobmFtZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgIAkJT2JqZWN0IGVsZSA9IG5hbWUubmV4dEVsZW1lbnQoKTsKLSAgICAJCWlmIChlbGUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZmlsZS5nZXQoZWxlKSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgIAkJCXJldC5hZGQoKFN0cmluZyllbGUpOwotICAgIAkJfQotICAgIAl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlUHJvamVjdERlcGVuZGVuY3lGZWF0dXJlcyhQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgU2V0PEFydGlmYWN0PiBkZXBlbmRlbmNpZXMgPSAoU2V0PEFydGlmYWN0Pilwcm9qZWN0LmdldERlcGVuZGVuY3lBcnRpZmFjdHMoKTsKLSAgICAgICAgZGVwZW5kZW5jaWVzLnJlbW92ZUFsbChwcm92aWRlZCk7Ci0gICAgICAgIGZvciAoQXJ0aWZhY3QgYXJ0aWZhY3QgOiBkZXBlbmRlbmNpZXMpIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIiBHZW5lcmF0aW5nIGZlYXR1cmUgIiArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSArICIgZnJvbSAiICsgYXJ0aWZhY3QpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgPGZlYXR1cmUgbmFtZT0nIiArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSArICInPiIpOwotICAgICAgICAgICAgY3VycmVudEZlYXR1cmUuY2xlYXIoKTsKLSAgICAgICAgICAgIHdyaXRlQnVuZGxlKG91dCwgYXJ0aWZhY3QpOwotICAgICAgICAgICAgZmVhdHVyZXMuYWRkKGFydGlmYWN0KTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCIgIDwvZmVhdHVyZT4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWlzc2luZ0J1bmRsZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAJZ2V0TG9nKCkuaW5mbygiLS0gU29tZSBidW5kbGVzIHdlcmUgbWlzc2luZyAgLS0iKTsKLSAgICAgICAgCWZvciAoQXJ0aWZhY3QgYXJ0aWZhY3QgOiBtaXNzaW5nQnVuZGxlcykgewotICAgICAgICAJCWdldExvZygpLmluZm8oU3RyaW5nLmZvcm1hdCgiICVzIiwgYXJ0aWZhY3QpKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZUJ1bmRsZShQcmludFN0cmVhbSBvdXQsIEFydGlmYWN0IGFydGlmYWN0KSB7Ci0gICAgCUFydGlmYWN0IHJlcGxhY2VtZW50ID0gZ2V0UmVwbGFjZW1lbnQoYXJ0aWZhY3QpOwotICAgIAlpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewotICAgIAkJd3JpdGVCdW5kbGUob3V0LCByZXBsYWNlbWVudCk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAgICAgaWYgKGlzUHJvdmlkZWQoYXJ0aWZhY3QpKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhTdHJpbmcuZm9ybWF0KCJTa2lwcGluZyAnJXMnIC0tIGJ1bmRsZSB3aWxsIGJlIHByb3ZpZGVkIGF0IHJ1bnRpbWUiLCBhcnRpZmFjdCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmZWF0dXJlcy5jb250YWlucyhhcnRpZmFjdCkpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGFscmVhZHkgY3JlYXRlZCBhIGZlYXR1cmUgZm9yIHRoaXMgb25lLCBqdXN0IGFkZCB0aGF0IGluc3RlYWQgb2YgdGhlIGJ1bmRsZQotICAgICAgICAgICAgb3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiICAgIDxmZWF0dXJlPiVzPC9mZWF0dXJlPiIsIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZpcnN0IHdyaXRlIHRoZSBkZXBlbmRlbmNpZXMKLSAgICAgICAgZm9yIChBcnRpZmFjdCBkZXBlbmRlbmN5IDogZ2V0RGVwZW5kZW5jaWVzKGFydGlmYWN0KSkgewotICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kuaXNPcHRpb25hbCgpIHx8IEFydGlmYWN0LlNDT1BFX1RFU1QuZXF1YWxzKGRlcGVuZGVuY3kuZ2V0U2NvcGUoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBvbWl0IG9wdGlvbmFsIGRlcGVuZGVuY2llcwotICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKFN0cmluZy5mb3JtYXQoIk9taXR0aW5nIG9wdGlvbmFsIGFuZC9vciB0ZXN0IHNjb3BlZCBkZXBlbmRlbmN5ICclcycgZm9yICclcyciLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3ksIGFydGlmYWN0KSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhTdHJpbmcuZm9ybWF0KCJBZGRpbmcgJyVzJyBhcyBhIGRlcGVuZGVuY3kgZm9yICclcyciLCBkZXBlbmRlbmN5LCBhcnRpZmFjdCkpOwotICAgICAgICAgICAgd3JpdGVCdW5kbGUob3V0LCBkZXBlbmRlbmN5KTsKLSAgICAgICAgfQotICAgICAgICAvLyBza2lwIHRoZSBidW5kbGUgaWYgaXQgd2FzIGFscmVhZHkgYWRkZWQgdG8gdGhpcyBmZWF0dXJlIHByZXZpb3VzbHkKLSAgICAgICAgaWYgKCFjdXJyZW50RmVhdHVyZS5hZGQoYXJ0aWZhY3QpKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhTdHJpbmcuZm9ybWF0KCJBcnRpZmFjdCAnJXMnIHdhcyBhbHJlYWR5IGFkZGVkIHRvIHRoZSBjdXJyZW50IGZlYXR1cmUiLCBhcnRpZmFjdCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIGFuZCB0aGVuIHdyaXRlIHRoZSBidW5kbGUgaXRzZWxmCi0gICAgICAgIGlmIChpc0J1bmRsZShhcnRpZmFjdCkpIHsKLSAgICAgICAgCWdldExvZygpLmluZm8oU3RyaW5nLmZvcm1hdCgiICBhZGRpbmcgYnVuZGxlICVzIiwgYXJ0aWZhY3QpKTsKLSAgICAgICAgICAgIHdyaXRlQnVuZGxlKG91dCwgYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpLCBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCksIGFydGlmYWN0LmdldEJhc2VWZXJzaW9uKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXJ0aWZhY3Qgd3JhcHBlciA9IGZpbmRTZXJ2aWNlbWl4QnVuZGxlKGFydGlmYWN0KTsKLSAgICAgICAgICAgIGlmICh3cmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlnZXRMb2coKS5pbmZvKFN0cmluZy5mb3JtYXQoIiAgYWRkaW5nIGJ1bmRsZSAlcyAoZm9yICVzKSIsIHdyYXBwZXIsIGFydGlmYWN0KSk7Ci0gICAgICAgICAgICAJd3JpdGVCdW5kbGUob3V0LCB3cmFwcGVyLmdldEdyb3VwSWQoKSwgd3JhcHBlci5nZXRBcnRpZmFjdElkKCksIHdyYXBwZXIuZ2V0QmFzZVZlcnNpb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgCWdldExvZygpLmVycm9yKFN0cmluZy5mb3JtYXQoIiB1bmFibGUgdG8gZmluZCBzdWl0YWJsZSBidW5kbGUgZm9yIGFydGlmYWN0ICclcyciLCBhcnRpZmFjdCkpOwotICAgICAgICAgICAgCW1pc3NpbmdCdW5kbGVzLmFkZChhcnRpZmFjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcml2YXRlIEFydGlmYWN0IGdldFJlcGxhY2VtZW50KEFydGlmYWN0IGFydGlmYWN0KSB7Ci0JCVN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIlcy8lcyIsIGFydGlmYWN0LmdldEdyb3VwSWQoKSwgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpKTsKLQkJU3RyaW5nIGJ1bmRsZSA9IG51bGw7Ci0JCWZvciAoVmVyc2lvblJhbmdlIHJhbmdlIDogdHJhbnNsYXRpb25zLmdldChrZXkpLmtleVNldCgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChyYW5nZS5jb250YWluc1ZlcnNpb24oYXJ0aWZhY3QuZ2V0U2VsZWN0ZWRWZXJzaW9uKCkpKSB7Ci0JCQkJCWJ1bmRsZSA9IHRyYW5zbGF0aW9ucy5nZXQoa2V5KS5nZXQocmFuZ2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGNhdGNoIChPdmVyQ29uc3RyYWluZWRWZXJzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlidW5kbGUgPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gc3BsaXQgPSBidW5kbGUuc3BsaXQoIi8iKTsKLQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0KHNwbGl0WzBdLCBzcGxpdFsxXSwgc3BsaXRbMl0sIEFydGlmYWN0LlNDT1BFX1BST1ZJREVELCBhcnRpZmFjdC5nZXRBcnRpZmFjdEhhbmRsZXIoKS5nZXRQYWNrYWdpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgQXJ0aWZhY3QgZmluZFNlcnZpY2VtaXhCdW5kbGUoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgQXJ0aWZhY3Qgbm9WZXJzaW9uV3JhcHBlciA9IGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3QoIm9yZy5hcGFjaGUuc2VydmljZW1peC5idW5kbGVzIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnNlcnZpY2VtaXguYnVuZGxlcy4iICsgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdC5nZXRTY29wZSgpLCBhcnRpZmFjdC5nZXRUeXBlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdCB2ZXJzaW9ucyA9IGFydGlmYWN0TWV0YWRhdGFTb3VyY2UucmV0cmlldmVBdmFpbGFibGVWZXJzaW9ucyhub1ZlcnNpb25XcmFwcGVyLCBsb2NhbFJlcG8sIHJlbW90ZVJlcG9zKTsKLSAgICAgICAgICAgIEFydGlmYWN0IHdyYXBwZXIgPSBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0KCJvcmcuYXBhY2hlLnNlcnZpY2VtaXguYnVuZGxlcyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuc2VydmljZW1peC5idW5kbGVzLiIgKyBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmVzdFZlcnNpb25Gb3JBcnRpZmFjdChhcnRpZmFjdCwgdmVyc2lvbnMpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0LmdldFNjb3BlKCksIGFydGlmYWN0LmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAvLyBsZXQncyBjaGVjayBpZiB0aGUgc2VydmljZW1peCBidW5kbGUgZm9yIHRoaXMgYXJ0aWZhY3QgZXhpc3RzCi0gICAgICAgICAgICByZXNvbHZlci5yZXNvbHZlKHdyYXBwZXIsIHJlbW90ZVJlcG9zLCBsb2NhbFJlcG8pOwotICAgICAgICAgICAgZm9yIChBcnRpZmFjdCBkZXBlbmRlbmN5IDogZ2V0RGVwZW5kZW5jaWVzKHdyYXBwZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy9zb21lIG9mIHRoZXNlIHdyYXBwZXIgYnVuZGxlcyBwcm92aWRlIGZvciBtdWx0aXBsZSBKQVIgZmlsZXMsIG5vIG5lZWQgdG8gaW5jbHVkZSBhbnkgb2YgdGhlbSBhZnRlciBhZGRpbmcgdGhlIHdyYXBwZXIKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhTdHJpbmcuZm9ybWF0KCInJXMnIGFsc28gcHJvdmlkZXMgJyVzJyIsIHdyYXBwZXIsIGRlcGVuZGVuY3kpKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50RmVhdHVyZS5hZGQoZGVwZW5kZW5jeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlcjsKLSAgICAgICAgfSBjYXRjaCAoQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJDb3VsZG4ndCBmaW5kIGEgU2VydmljZU1peCBidW5kbGUgZm9yICIgKyBhcnRpZmFjdCwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkNvdWxkbid0IGZpbmQgYSBTZXJ2aWNlTWl4IGJ1bmRsZSBmb3IgIiArIGFydGlmYWN0LCBlKTsKLSAgICAgICAgfSBjYXRjaCAoQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiQ291bGRuJ3QgZmluZCBhIFNlcnZpY2VNaXggYnVuZGxlIGZvciAiICsgYXJ0aWZhY3QsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkuY29udGFpbnMoIi0iKSkgewotICAgICAgICAgICAgLy9sZXQncyB0cnkgdG8gc2VlIGlmIHdlIGNhbid0IGZpbmQgYSBidW5kbGUgd3JhcHBpbmcgbXVsdGlwbGUgYXJ0aWZhY3RzIChlLmcuIG1pbmEgLT4gbWluYS1jb3JlLCBtaW5hLWNvZGVjLCAuLi4pCi0gICAgICAgICAgICByZXR1cm4gZmluZFNlcnZpY2VtaXhCdW5kbGUoZmFjdG9yeS5jcmVhdGVBcnRpZmFjdChhcnRpZmFjdC5nZXRHcm91cElkKCksIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKS5zcGxpdCgiLSIpWzBdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0LmdldFZlcnNpb24oKSwgYXJ0aWZhY3QuZ2V0U2NvcGUoKSwgYXJ0aWZhY3QuZ2V0VHlwZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmVzdFZlcnNpb25Gb3JBcnRpZmFjdChBcnRpZmFjdCBhcnRpZmFjdCwgTGlzdDxBcnRpZmFjdFZlcnNpb24+IHZlcnNpb25zKSB0aHJvd3MgQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2ZXJzaW9ucy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFydGlmYWN0TWV0YWRhdGFSZXRyaWV2YWxFeGNlcHRpb24oIk5vIHdyYXBwZXIgYnVuZGxlIGF2YWlsYWJsZSBmb3IgIiArIGFydGlmYWN0KTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHZlcnNpb25zLCBDb2xsZWN0aW9ucy5yZXZlcnNlT3JkZXIoKSk7Ci0gICAgICAgIC8vY2hlY2sgZm9yIHNhbWUgdmVyc2lvbgotICAgICAgICBmb3IgKEFydGlmYWN0VmVyc2lvbiB2ZXJzaW9uIDogdmVyc2lvbnMpIHsKLSAgICAgICAgICAgIGlmICh2ZXJzaW9uLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChhcnRpZmFjdC5nZXRWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2NoZWNrIGZvciBzYW1lIG1ham9yL21pbm9yIHZlcnNpb24KLSAgICAgICAgZm9yIChBcnRpZmFjdFZlcnNpb24gdmVyc2lvbiA6IHZlcnNpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBlbGVtZW50cyA9IHZlcnNpb24udG9TdHJpbmcoKS5zcGxpdCgiXFwuIik7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID49IDIgJiYgYXJ0aWZhY3QuZ2V0VmVyc2lvbigpLnN0YXJ0c1dpdGgoZWxlbWVudHNbMF0gKyAiLiIgKyBlbGVtZW50c1sxXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBBcnRpZmFjdE1ldGFkYXRhUmV0cmlldmFsRXhjZXB0aW9uKCJObyBzdWl0YWJsZSB2ZXJzaW9uIGZvdW5kIGZvciAiICsgYXJ0aWZhY3QgKyAiIHdyYXBwZXIgYnVuZGxlIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHJvdmlkZWQoQXJ0aWZhY3QgYnVuZGxlKSB7Ci0gICAgICAgIGZvciAoQXJ0aWZhY3QgYXJ0aWZhY3QgOiBwcm92aWRlZCkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZS5nZXRBcnRpZmFjdElkKCkuZXF1YWxzKGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSkKLSAgICAgICAgICAgICAgICAmJiBidW5kbGUuZ2V0R3JvdXBJZCgpLmVxdWFscyhhcnRpZmFjdC5nZXRHcm91cElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0J1bmRsZShBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICBpZiAoYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RIYW5kbGVyKCkuZ2V0UGFja2FnaW5nKCkuZXF1YWxzKCJidW5kbGUiKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoYXJ0aWZhY3QsIHJlbW90ZVJlcG9zLCBsb2NhbFJlcG8pOwotICAgICAgICAgICAgICAgIFppcEZpbGUgZmlsZSA9IG5ldyBaaXBGaWxlKGFydGlmYWN0LmdldEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBmaWxlLmdldEVudHJ5KCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotICAgICAgICAgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLSAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QuZ2V0QnNuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhTdHJpbmcuZm9ybWF0KCJNQU5JRkVTVC5NRiBmb3IgJyVzJyBjb250YWlucyBCdW5kbGUtTmFtZSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCwgbWFuaWZlc3QuZ2V0QnNuKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIGRldGVybWluZSBpZiAiICsgYXJ0aWZhY3QgKyAiIGlzIGEgYnVuZGxlOyBkZWZhdWx0aW5nIHRvIGZhbHNlIiwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIGRldGVybWluZSBpZiAiICsgYXJ0aWZhY3QgKyAiIGlzIGEgYnVuZGxlOyBkZWZhdWx0aW5nIHRvIGZhbHNlIiwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oIlVuYWJsZSB0byBkZXRlcm1pbmUgaWYgIiArIGFydGlmYWN0ICsgIiBpcyBhIGJ1bmRsZTsgZGVmYXVsdGluZyB0byBmYWxzZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8QXJ0aWZhY3Q+IGdldERlcGVuZGVuY2llcyhBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICBMaXN0PEFydGlmYWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdD4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlc29sdXRpb25Hcm91cCBwb20gPSBhcnRpZmFjdE1ldGFkYXRhU291cmNlLnJldHJpZXZlKGFydGlmYWN0LCBsb2NhbFJlcG8sIHJlbW90ZVJlcG9zKTsKLSAgICAgICAgICAgIGlmIChwb20gIT0gbnVsbCkgewotICAgICAgICAgICAgCWxpc3QuYWRkQWxsKHBvbS5nZXRBcnRpZmFjdHMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFydGlmYWN0TWV0YWRhdGFSZXRyaWV2YWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIG1ldGFkYXRhIGZvciAiICsgYXJ0aWZhY3QgKyAiLCBub3QgaW5jbHVkaW5nIGRlcGVuZGVuY2llcyBmb3IgaXQiKTsKLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZEFydGlmYWN0UlRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIG1ldGFkYXRhIGZvciAiICsgYXJ0aWZhY3QgKyAiLCBub3QgaW5jbHVkaW5nIGRlcGVuZGVuY2llcyBmb3IgaXQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZUN1cnJlbnRQcm9qZWN0RmVhdHVyZShQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIiAgPGZlYXR1cmUgbmFtZT0nIiArIGZlYXR1cmVOYW1lICsgIic+Iik7Ci0KLSAgICAgICAgd3JpdGVCdW5kbGUob3V0LCBwcm9qZWN0LmdldEdyb3VwSWQoKSwgcHJvamVjdC5nZXRBcnRpZmFjdElkKCksIHByb2plY3QuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHByb2plY3QuZ2V0RGVwZW5kZW5jaWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gKERlcGVuZGVuY3kpaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoaXNWYWxpZERlcGVuZGVuY3koZGVwZW5kZW5jeSkpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVCdW5kbGUob3V0LCBkZXBlbmRlbmN5LmdldEdyb3VwSWQoKSwgZGVwZW5kZW5jeS5nZXRBcnRpZmFjdElkKCksIGRlcGVuZGVuY3kuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludGxuKCIgIDwvZmVhdHVyZT4iKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkRGVwZW5kZW5jeShEZXBlbmRlbmN5IGRlcGVuZGVuY3kpIHsKLSAgICAgICAgLy8gVE9ETyBmaWx0ZXIgb3V0IG9ubHkgY29tcGlsZSB0aW1lIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgT1NHaQotICAgICAgICAvLyBidW5kbGVzPwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUJ1bmRsZShQcmludFN0cmVhbSBvdXQsIFN0cmluZyBncm91cElkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgb3V0LnByaW50KCIgICAgPGJ1bmRsZT5tdm46Iik7Ci0gICAgICAgIG91dC5wcmludChncm91cElkKTsKLSAgICAgICAgb3V0LnByaW50KCIvIik7Ci0gICAgICAgIG91dC5wcmludChhcnRpZmFjdElkKTsKLSAgICAgICAgb3V0LnByaW50KCIvIik7Ci0gICAgICAgIG91dC5wcmludCh2ZXJzaW9uKTsKLSAgICAgICAgb3V0LnByaW50KCI8L2J1bmRsZT4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9HZW5lcmF0ZUZlYXR1cmVzWG1sTW9qby5qYXZhIGIvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L3Rvb2xpbmcvZmVhdHVyZXMvR2VuZXJhdGVGZWF0dXJlc1htbE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmNWUyYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9HZW5lcmF0ZUZlYXR1cmVzWG1sTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmcuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkludmFsaWRBcnRpZmFjdFJURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWV0YWRhdGEuQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLlJlc29sdXRpb25Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5EZWZhdWx0QXJ0aWZhY3RDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5kZXBlbmRlbmN5LnRyZWUuRGVwZW5kZW5jeU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuZGVwZW5kZW5jeS50cmVlLkRlcGVuZGVuY3lUcmVlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5kZXBlbmRlbmN5LnRyZWUuRGVwZW5kZW5jeVRyZWVCdWlsZGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmRlcGVuZGVuY3kudHJlZS50cmF2ZXJzYWwuRGVwZW5kZW5jeU5vZGVWaXNpdG9yOwotaW1wb3J0IG9yZy5vc2dpLmltcGwuYnVuZGxlLm9ici5yZXNvdXJjZS5NYW5pZmVzdDsKLWltcG9ydCBvcmcub3NnaS5pbXBsLmJ1bmRsZS5vYnIucmVzb3VyY2UuTWFuaWZlc3RFbnRyeTsKLWltcG9ydCBvcmcub3NnaS5pbXBsLmJ1bmRsZS5vYnIucmVzb3VyY2UuVmVyc2lvblJhbmdlOwotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZmVhdHVyZXMgWE1MIGZpbGUKLSAqIAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJAotICogQGdvYWwgZ2VuZXJhdGUtZmVhdHVyZXMteG1sCi0gKiBAcGhhc2UgY29tcGlsZQotICogQGV4ZWN1dGUgcGhhc2U9ImNvbXBpbGUiCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKiBAaW5oZXJpdEJ5RGVmYXVsdCB0cnVlCi0gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIHRoZSBmZWF0dXJlcyBYTUwgZmlsZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUZlYXR1cmVzWG1sTW9qbyBleHRlbmRzIE1vam9TdXBwb3J0IHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGRlcGVuZGVuY3kgdHJlZSBidWlsZGVyIHRvIHVzZS4KLSAgICAgKiAKLSAgICAgKiBAY29tcG9uZW50Ci0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBEZXBlbmRlbmN5VHJlZUJ1aWxkZXIgZGVwZW5kZW5jeVRyZWVCdWlsZGVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGUgdG8gZ2VuZXJhdGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXMvZmVhdHVyZS54bWwiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dEZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYXJ0aWZhY3QgdHlwZSBmb3IgYXR0YWNoaW5nIHRoZSBnZW5lcmF0ZWQgZmlsZSB0byB0aGUgcHJvamVjdAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0ieG1sIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGF0dGFjaG1lbnRBcnRpZmFjdFR5cGUgPSAieG1sIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBhcnRpZmFjdCBjbGFzc2lmaWVyIGZvciBhdHRhY2hpbmcgdGhlIGdlbmVyYXRlZCBmaWxlIHRvIHRoZSBwcm9qZWN0Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJmZWF0dXJlcyIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBhdHRhY2htZW50QXJ0aWZhY3RDbGFzc2lmaWVyID0gImZlYXR1cmVzIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBrZXJuZWwgdmVyc2lvbiBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIGJ1bmRsZQotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBrZXJuZWxWZXJzaW9uOwotICAgIAotICAgIC8qCi0gICAgICogQSBsaXN0IG9mIHBhY2thZ2VzIGV4cG9ydGVkIGJ5IHRoZSBrZXJuZWwKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFZlcnNpb25SYW5nZT4ga2VybmVsRXhwb3J0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmVyc2lvblJhbmdlPigpOwotCi0gICAgLyoqCi0gICAgICogQSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgYnVuZGxlcwotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgYnVuZGxlczsKLQotICAgIC8qCi0gICAgICogQSBzZXQgb2Yga25vd24gYnVuZGxlcwotICAgICAqLwotICAgIHByaXZhdGUgU2V0PFN0cmluZz4ga25vd25CdW5kbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIAotICAgIC8qCi0gICAgICogQSBsaXN0IG9mIGV4cG9ydHMgYnkgdGhlIGJ1bmRsZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxWZXJzaW9uUmFuZ2UsIEFydGlmYWN0Pj4gYnVuZGxlRXhwb3J0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFZlcnNpb25SYW5nZSwgQXJ0aWZhY3Q+PigpOwotCi0gICAgLyoKLSAgICAgKiBUaGUgc2V0IG9mIHN5c3RlbSBleHBvcnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3lzdGVtRXhwb3J0cyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLSAgICAKLSAgICAvKgotICAgICAqIFRoZXNlIGJ1bmRsZXMgYXJlIHRoZSBmZWF0dXJlcyB0aGF0IHdpbGwgYmUgYnVpbHQKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxBcnRpZmFjdCwgRmVhdHVyZT4gZmVhdHVyZXMgPSBuZXcgSGFzaE1hcDxBcnRpZmFjdCwgRmVhdHVyZT4oKTsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpKTsKLSAgICAgICAgICAgIHJlYWRTeXN0ZW1QYWNrYWdlcygpOwotICAgICAgICAgICAgcmVhZEtlcm5lbEJ1bmRsZXMoKTsKLSAgICAgICAgICAgIHJlYWRCdW5kbGVzKCk7Ci0gICAgICAgICAgICBkaXNjb3ZlckJ1bmRsZXMoKTsKLSAgICAgICAgICAgIHdyaXRlRmVhdHVyZXMob3V0KTsKLSAgICAgICAgICAgIC8vIG5vdyBsZXRzIGF0dGFjaCBpdAotICAgICAgICAgICAgcHJvamVjdEhlbHBlci5hdHRhY2hBcnRpZmFjdChwcm9qZWN0LCBhdHRhY2htZW50QXJ0aWZhY3RUeXBlLCBhdHRhY2htZW50QXJ0aWZhY3RDbGFzc2lmaWVyLCBvdXRwdXRGaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZygpLmVycm9yKGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgZmVhdHVyZXMueG1sIGZpbGU6ICIgKyBlLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotCS8qCi0gICAgICogUmVhZCBhbGwgdGhlIHN5c3RlbSBwcm92aWRlZCBwYWNrYWdlcyBmcm9tIHRoZSA8Y29kZT5jb25maWcucHJvcGVydGllczwvY29kZT4gZmlsZSAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZFN5c3RlbVBhY2thZ2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcGVydGllcy5sb2FkKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJjb25maWcucHJvcGVydGllcyIpKTsKLSAgICAgICAgcmVhZFN5c3RlbVBhY2thZ2VzKHByb3BlcnRpZXMsICJqcmUtMS41Iik7Ci0gICAgICAgIHJlYWRTeXN0ZW1QYWNrYWdlcyhwcm9wZXJ0aWVzLCAib3NnaSIpOwotICAgIH0KLQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWFkU3lzdGVtUGFja2FnZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlcyA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHBrZyA6IHBhY2thZ2VzLnNwbGl0KCI7IikpIHsKLSAgICAgICAgICAgIHN5c3RlbUV4cG9ydHMuYWRkKHBrZy50cmltKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEb3dubG9hZCBhIEtlcm5lbCBkaXN0cm8gYW5kIGNoZWNrIHRoZSBsaXN0IG9mIGJ1bmRsZXMgcHJvdmlkZWQgYnkgdGhlIEtlcm5lbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkS2VybmVsQnVuZGxlcygpIHRocm93cyBBcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb24sIEFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb24sIE1vam9FeGVjdXRpb25FeGNlcHRpb24sCi0gICAgICAgIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIERlcGVuZGVuY3lUcmVlQnVpbGRlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248QXJ0aWZhY3Q+IGtlcm5lbEFydGlmYWN0czsKLSAgICAgICAgaWYgKGtlcm5lbFZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJTdGVwIDE6IEJ1aWxkaW5nIGxpc3Qgb2YgcHJvdmlkZWQgYnVuZGxlIGV4cG9ydHMiKTsKLSAgICAgICAgICAga2VybmVsQXJ0aWZhY3RzID0gbmV3IEhhc2hTZXQ8QXJ0aWZhY3Q+KCk7Ci0gICAgICAgICAgIERlcGVuZGVuY3lOb2RlIHRyZWUgPSBkZXBlbmRlbmN5VHJlZUJ1aWxkZXIuYnVpbGREZXBlbmRlbmN5VHJlZShwcm9qZWN0LCBsb2NhbFJlcG8sIGZhY3RvcnksIGFydGlmYWN0TWV0YWRhdGFTb3VyY2UsIG5ldyBBcnRpZmFjdEZpbHRlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZShBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgIH0sIG5ldyBEZWZhdWx0QXJ0aWZhY3RDb2xsZWN0b3IoKSk7Ci0gICAgICAgICAgIHRyZWUuYWNjZXB0KG5ldyBEZXBlbmRlbmN5Tm9kZVZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5kVmlzaXQoRGVwZW5kZW5jeU5vZGUgbm9kZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRoZSBuZXh0IHNpYmxpbmcgdG9vCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChEZXBlbmRlbmN5Tm9kZSBub2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldFN0YXRlKCkgIT0gRGVwZW5kZW5jeU5vZGUuT01JVFRFRF9GT1JfQ09ORkxJQ1QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gbm9kZS5nZXRBcnRpZmFjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFydGlmYWN0LlNDT1BFX1BST1ZJREVELmVxdWFscyhhcnRpZmFjdC5nZXRTY29wZSgpKSAmJiAhYXJ0aWZhY3QuZ2V0VHlwZSgpLmVxdWFscygicG9tIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxBcnRpZmFjdHMuYWRkKGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRoZSBjaGlsZHJlbiB0b28KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJTdGVwIDEgOiBCdWlsZGluZyBsaXN0IG9mIGtlcm5lbCBleHBvcnRzIik7Ci0gICAgICAgICAgICBnZXRMb2coKS53YXJuKCJVc2Ugb2YgJ2tlcm5lbFZlcnNpb24nIGlzIGRlcHJlY2F0ZWQgLS0gdXNlIGEgZGVwZW5kZW5jeSB3aXRoIHNjb3BlICdwcm92aWRlZCcgaW5zdGVhZCIpOwotICAgICAgICAgICAgQXJ0aWZhY3Qga2VybmVsID0gZmFjdG9yeS5jcmVhdGVBcnRpZmFjdCgib3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lmtlcm5lbCIsICJhcGFjaGUtc2VydmljZW1peC1rZXJuZWwiLCBrZXJuZWxWZXJzaW9uLCBBcnRpZmFjdC5TQ09QRV9QUk9WSURFRCwgInBvbSIpOwotICAgICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZShrZXJuZWwsIHJlbW90ZVJlcG9zLCBsb2NhbFJlcG8pOwotICAgICAgICAgICAga2VybmVsQXJ0aWZhY3RzID0gZ2V0RGVwZW5kZW5jaWVzKGtlcm5lbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChBcnRpZmFjdCBhcnRpZmFjdCA6IGtlcm5lbEFydGlmYWN0cykgewotICAgICAgICAgICAgcmVnaXN0ZXJLZXJuZWxCdW5kbGUoYXJ0aWZhY3QpOwotICAgICAgICB9Ci0gICAgICAgIGdldExvZygpLmluZm8oIi4uLmRvbmUhIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyS2VybmVsQnVuZGxlKEFydGlmYWN0IGFydGlmYWN0KSB0aHJvd3MgQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uLCBBcnRpZmFjdE5vdEZvdW5kRXhjZXB0aW9uLCBaaXBFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoYXJ0aWZhY3QpOwotICAgICAgICBpZiAobWFuaWZlc3QuZ2V0RXhwb3J0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTWFuaWZlc3RFbnRyeSBlbnRyeSA6IChMaXN0PE1hbmlmZXN0RW50cnk+KW1hbmlmZXN0LmdldEV4cG9ydHMoKSkgewotICAgICAgICAgICAgICAgIGtlcm5lbEV4cG9ydHMucHV0KGVudHJ5LmdldE5hbWUoKSwgZW50cnkuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiIGFkZGluZyBrZXJuZWwgZXhwb3J0ICIgKyBlbnRyeS5nZXROYW1lKCkgKyAiICgiICsgZW50cnkuZ2V0VmVyc2lvbigpICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZWdpc3RlckJ1bmRsZShhcnRpZmFjdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZWFkIHRoZSBsaXN0IG9mIGJ1bmRsZXMgd2UgY2FuIHVzZSB0byBzYXRpc2Z5IGxpbmtzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRCdW5kbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBBcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb24sIEFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb24geyAgICAgICAgCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiU3RlcCAyIDogQnVpbGRpbmcgYSBsaXN0IG9mIGV4cG9ydHMgZm9yIGJ1bmRsZXMgaW4gIiArIGJ1bmRsZXMuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihidW5kbGVzKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKCIvIikgJiYgIWxpbmUuc3RhcnRzV2l0aCgiIyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBlbGVtZW50cyA9IGxpbmUuc3BsaXQoIi8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gZmFjdG9yeS5jcmVhdGVBcnRpZmFjdChlbGVtZW50c1swXSwgZWxlbWVudHNbMV0sIGVsZW1lbnRzWzJdLCBBcnRpZmFjdC5TQ09QRV9QUk9WSURFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50c1szXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckJ1bmRsZShhcnRpZmFjdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIlN0ZXAgMiA6IE5vIEJ1bmRsZSBmaWxlIHN1cHBsaWVkIGZvciBidWlsZGluZyBsaXN0IG9mIGV4cG9ydHMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdldExvZygpLmluZm8oIi4uLmRvbmUhIik7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogQXV0by1kaXNjb3ZlciBidW5kbGVzIGN1cnJlbnRseSBpbiB0aGUgZGVwZW5kZW5jaWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2NvdmVyQnVuZGxlcygpIHRocm93cyBBcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb24sIEFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb24sIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIAlnZXRMb2coKS5pbmZvKCJTdGVwIDMgOiBEaXNjb3ZlcmluZyBidW5kbGVzIGluIE1hdmVuIGRlcGVuZGVuY2llcyIpOwotCQlmb3IgKEFydGlmYWN0IGRlcGVuZGVuY3kgOiAoU2V0PEFydGlmYWN0PikgcHJvamVjdC5nZXRBcnRpZmFjdHMoKSkgewotCQkJLy8gd2Ugd2lsbCBnZW5lcmF0ZSBhIGZlYXR1cmUgZm9yIHRoaXMgYWZ0ZXJ3YXJkcwotCQkJaWYgKHByb2plY3QuZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpLmNvbnRhaW5zKGRlcGVuZGVuY3kpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvLyB0aGlzIGlzIGEgcHJvdmlkZWQgYnVuZGxlLCBoYXMgYmVlbiBoYW5kbGVkIGluIHN0ZXAgMQotCQkJaWYgKGRlcGVuZGVuY3kuZ2V0U2NvcGUoKS5lcXVhbHMoQXJ0aWZhY3QuU0NPUEVfUFJPVklERUQpKSB7Ci0JCQkgICAgY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoaXNEaXNjb3ZlcmFibGVCdW5kbGUoZGVwZW5kZW5jeSkpIHsKLQkJCQlnZXRMb2coKS5pbmZvKCIgIERpc2NvdmVyZWQgIiArIGRlcGVuZGVuY3kpOwotCQkJCXJlZ2lzdGVyQnVuZGxlKGRlcGVuZGVuY3kpOwotCQkJfQotCQl9Ci0JCWdldExvZygpLmluZm8oIi4uLmRvbmUhIik7Ci0JfQotCi0gICAgLyoKLSAgICAgKiBXcml0ZSBhbGwgcHJvamVjdCBkZXBlbmRlbmNpZXMgYXMgZmVhdHVyZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUZlYXR1cmVzKFByaW50U3RyZWFtIG91dCkgdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiwgQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIlN0ZXAgNCA6IEdlbmVyYXRpbmcgIiArIG91dHB1dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBvdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCI8ZmVhdHVyZXM+Iik7Ci0gICAgICAgIFNldDxBcnRpZmFjdD4gZGVwZW5kZW5jaWVzID0gKFNldDxBcnRpZmFjdD4pcHJvamVjdC5nZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCk7Ci0gICAgICAgIGZvciAoQXJ0aWZhY3QgYXJ0aWZhY3QgOiBkZXBlbmRlbmNpZXMpIHsKLSAgICAgICAgICAgIGlmICghYXJ0aWZhY3QuZ2V0U2NvcGUoKS5lcXVhbHMoQXJ0aWZhY3QuU0NPUEVfUFJPVklERUQpICYmICFhcnRpZmFjdC5nZXRUeXBlKCkuZXF1YWxzKCJwb20iKSkgewotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIiBHZW5lcmF0aW5nIGZlYXR1cmUgIiArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSArICIgZnJvbSAiICsgYXJ0aWZhY3QpOwotICAgICAgICAgICAgICAgIEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoYXJ0aWZhY3QpOwotICAgICAgICAgICAgICAgIGZlYXR1cmUud3JpdGUob3V0KTsKLSAgICAgICAgICAgICAgICByZWdpc3RlckZlYXR1cmUoYXJ0aWZhY3QsIGZlYXR1cmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKCI8L2ZlYXR1cmVzPiIpOwotICAgICAgICBnZXRMb2coKS5pbmZvKCIuLi5kb25lISIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBmZWF0dXJlIGZvciBhbiBhcnRpZmFjdCAKLSAgICAgKi8KLSAgICBwcml2YXRlIEZlYXR1cmUgZ2V0RmVhdHVyZShBcnRpZmFjdCBhcnRpZmFjdCkgdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiwgQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbiwgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZlYXR1cmUgZmVhdHVyZSA9IG5ldyBGZWF0dXJlKGFydGlmYWN0KTsKLSAgICAgICAgYWRkUmVxdWlyZW1lbnRzKGFydGlmYWN0LCBmZWF0dXJlKTsKLSAgICAgICAgcmV0dXJuIGZlYXR1cmU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPbmx5IGF1dG8tZGlzY292ZXIgYW4gT1NHaSBidW5kbGUKLSAgICAgKiAtIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGtub3duIGFzIGEgZmVhdHVyZSBpdHNlbGYKLSAgICAgKiAtIGlmIGl0IGlzIG5vdCBhbm90aGVyIHZlcnNpb24gb2YgYW4gYWxyZWFkeSBrbm93biBidW5kbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXNjb3ZlcmFibGVCdW5kbGUoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgaWYgKGlzQnVuZGxlKGFydGlmYWN0KSAmJiAhaXNGZWF0dXJlKGFydGlmYWN0KSAmJiAhYXJ0aWZhY3QuZ2V0U2NvcGUoKS5lcXVhbHMoQXJ0aWZhY3QuU0NPUEVfUFJPVklERUQpKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBrbm93biA6IGtub3duQnVuZGxlcykgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGVsZW1lbnRzID0ga25vd24uc3BsaXQoIi8iKTsKLSAgICAgICAgICAgICAgICBpZiAoYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpLmVxdWFscyhlbGVtZW50c1swXSkgJiYKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpLmVxdWFscyhlbGVtZW50c1sxXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoU3RyaW5nLmZvcm1hdCgiICBBdm9pZCBhdXRvLWRpc2NvdmVyeSBmb3IgJXMgYmVjYXVzZSBvZiBleGlzdGluZyBidW5kbGUgJXMiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhhcnRpZmFjdCksIGtub3duKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gYXJ0aWZhY3QgaXMgYSBidW5kbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCdW5kbGUoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgaWYgKGtub3duQnVuZGxlcy5jb250YWlucyh0b1N0cmluZyhhcnRpZmFjdCkpIHx8IGFydGlmYWN0LmdldEFydGlmYWN0SGFuZGxlcigpLmdldFBhY2thZ2luZygpLmVxdWFscygiYnVuZGxlIikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QuZ2V0QnNuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhTdHJpbmcuZm9ybWF0KCJNQU5JRkVTVC5NRiBmb3IgJyVzJyBjb250YWlucyBCdW5kbGUtTmFtZSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCwgbWFuaWZlc3QuZ2V0QnNuKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIlVuYWJsZSB0byBkZXRlcm1pbmUgaWYgIiArIGFydGlmYWN0ICsgIiBpcyBhIGJ1bmRsZTsgZGVmYXVsdGluZyB0byBmYWxzZSIsIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGlmICIgKyBhcnRpZmFjdCArICIgaXMgYSBidW5kbGU7IGRlZmF1bHRpbmcgdG8gZmFsc2UiLCBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIlVuYWJsZSB0byBkZXRlcm1pbmUgaWYgIiArIGFydGlmYWN0ICsgIiBpcyBhIGJ1bmRsZTsgZGVmYXVsdGluZyB0byBmYWxzZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotCi0gICAgLyoKLSAgICAgKiBBZGQgcmVxdWlyZW1lbnRzIGZvciBhbiBhcnRpZmFjdCB0byBhIGZlYXR1cmUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUmVxdWlyZW1lbnRzKEFydGlmYWN0IGFydGlmYWN0LCBGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBBcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb24sIEFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb24sIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KGFydGlmYWN0KTsKLSAgICAgICAgQ29sbGVjdGlvbjxNYW5pZmVzdEVudHJ5PiByZW1haW5pbmcgPSBnZXRSZW1haW5pbmdJbXBvcnRzKG1hbmlmZXN0KTsKLSAgICAgICAgQXJ0aWZhY3QgcHJldmlvdXMgPSBudWxsOwotICAgICAgICBmb3IgKE1hbmlmZXN0RW50cnkgZW50cnkgOiByZW1haW5pbmcpIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFkZCA9IG51bGw7Ci0gICAgICAgICAgICBNYXA8VmVyc2lvblJhbmdlLCBBcnRpZmFjdD4gdmVyc2lvbnMgPSBidW5kbGVFeHBvcnRzLmdldChlbnRyeS5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKHZlcnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFZlcnNpb25SYW5nZSByYW5nZSA6IHZlcnNpb25zLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZCA9IHZlcnNpb25zLmdldChyYW5nZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZS5jb21wYXJlVG8oZW50cnkuZ2V0VmVyc2lvbigpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSB2ZXJzaW9ucy5nZXQocmFuZ2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzT3B0aW9uYWwoZW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGxvZ2dpbmcgZm9yIG9wdGlvbmFsIGRlcGVuZGVuY3kuLi4KLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoU3RyaW5nLmZvcm1hdCgiICBVbmFibGUgdG8gZmluZCBzdWl0YWJsZSBidW5kbGUgZm9yIG9wdGlvbmFsIGRlcGVuZGVuY3kgJXMgKCVzKSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldE5hbWUoKSwgZW50cnkuZ2V0VmVyc2lvbigpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gLi4uYnV0IGEgd2FybmluZyBmb3IgYSBtYW5kYXRvcnkgZGVwZW5kZW5jeQotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiAgVW5hYmxlIHRvIGZpbmQgc3VpdGFibGUgYnVuZGxlIGZvciBkZXBlbmRlbmN5ICVzICglcykgKHJlcXVpcmVkIGJ5ICVzKSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0TmFtZSgpLCBlbnRyeS5nZXRWZXJzaW9uKCksIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhZGQuZXF1YWxzKHByZXZpb3VzKSAmJiBmZWF0dXJlLnB1c2goYWRkKSAmJiAhaXNGZWF0dXJlKGFkZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9hbmQgZ2V0IHJlcXVpcmVtZW50cyBmb3IgdGhlIGJ1bmRsZSB3ZSBqdXN0IGFkZGVkCi0gICAgICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCIgIEdldHRpbmcgcmVxdWlyZW1lbnRzIGZvciAiICsgYWRkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVxdWlyZW1lbnRzKGFkZCwgZmVhdHVyZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldmlvdXMgPSBhZGQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIGEgZ2l2ZW4gYnVuZGxlIGlzIGl0c2VsZiBiZWluZyBnZW5lcmF0ZWQgYXMgYSBmZWF0dXJlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmVhdHVyZShBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICByZXR1cm4gZmVhdHVyZXMuY29udGFpbnNLZXkoYXJ0aWZhY3QpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgYSBtYW5pZmVzdCBlbnRyeSBhbmQgY2hlY2sgaWYgdGhlIHJlc29sdXRpb24gZm9yIHRoZSBpbXBvcnQgaGFzIGJlZW4gbWFya2VkIGFzIG9wdGlvbmFsIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc09wdGlvbmFsKE1hbmlmZXN0RW50cnkgZW50cnkpIHsKLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsICYmIGVudHJ5LmdldEF0dHJpYnV0ZXMoKS5nZXQoInJlc29sdXRpb246IikgIT0gbnVsbAotICAgICAgICAgICAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlcygpLmdldCgicmVzb2x1dGlvbjoiKS5lcXVhbHMoIm9wdGlvbmFsIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZWdpc3RlciBhIGJ1bmRsZSwgZW5saXN0aW5nIGFsbCBwYWNrYWdlcyBpdCBwcm92aWRlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckJ1bmRsZShBcnRpZmFjdCBhcnRpZmFjdCkgdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiwgQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbiwgWmlwRXhjZXB0aW9uLAotICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJSZWdpc3RlcmluZyBidW5kbGUgIiArIGFydGlmYWN0KTsKLSAgICAgICAga25vd25CdW5kbGVzLmFkZCh0b1N0cmluZyhhcnRpZmFjdCkpOwotICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KGFydGlmYWN0KTsKLSAgICAgICAgZm9yIChNYW5pZmVzdEVudHJ5IGVudHJ5IDogZ2V0TWFuaWZlc3RFbnRyaWVzKG1hbmlmZXN0LmdldEV4cG9ydHMoKSkpIHsKLSAgICAgICAgICAgIE1hcDxWZXJzaW9uUmFuZ2UsIEFydGlmYWN0PiB2ZXJzaW9ucyA9IGJ1bmRsZUV4cG9ydHMuZ2V0KGVudHJ5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAodmVyc2lvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZlcnNpb25zID0gbmV3IEhhc2hNYXA8VmVyc2lvblJhbmdlLCBBcnRpZmFjdD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZlcnNpb25zLnB1dChlbnRyeS5nZXRWZXJzaW9uKCksIGFydGlmYWN0KTsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKFN0cmluZy5mb3JtYXQoIiAlcyBleHBvcnRlZCBieSBidW5kbGUgJXMiLCBlbnRyeS5nZXROYW1lKCksIGFydGlmYWN0KSk7Ci0gICAgICAgICAgICBidW5kbGVFeHBvcnRzLnB1dChlbnRyeS5nZXROYW1lKCksIHZlcnNpb25zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVnaXN0ZXIgYSBmZWF0dXJlIGFuZCBhbHNvIHJlZ2lzdGVyIHRoZSBidW5kbGUgZm9yIHRoZSBmZWF0dXJlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRmVhdHVyZShBcnRpZmFjdCBhcnRpZmFjdCwgRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uLCBBcnRpZmFjdE5vdEZvdW5kRXhjZXB0aW9uLCBaaXBFeGNlcHRpb24sCi0gICAgICAgIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmVhdHVyZXMucHV0KGFydGlmYWN0LCBmZWF0dXJlKTsKLSAgICAgICAgcmVnaXN0ZXJCdW5kbGUoYXJ0aWZhY3QpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRGV0ZXJtaW5lIHRoZSBsaXN0IG9mIGltcG9ydHMgdG8gYmUgcmVzb2x2ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIENvbGxlY3Rpb248TWFuaWZlc3RFbnRyeT4gZ2V0UmVtYWluaW5nSW1wb3J0cyhNYW5pZmVzdCBtYW5pZmVzdCkgewotICAgICAgICAvLyB0YWtlIGFsbCBpbXBvcnRzCi0gICAgICAgIENvbGxlY3Rpb248TWFuaWZlc3RFbnRyeT4gaW5wdXQgPSBnZXRNYW5pZmVzdEVudHJpZXMobWFuaWZlc3QuZ2V0SW1wb3J0cygpKTsKLSAgICAgICAgQ29sbGVjdGlvbjxNYW5pZmVzdEVudHJ5PiBvdXRwdXQgPSBuZXcgTGlua2VkTGlzdDxNYW5pZmVzdEVudHJ5PihpbnB1dCk7Ci0gICAgICAgIC8vIHJlbW92ZSBpbXBvcnRzIHNhdGlzZmllZCBieSBleHBvcnRzIGluIHRoZSBzYW1lIGJ1bmRsZQotICAgICAgICBmb3IgKE1hbmlmZXN0RW50cnkgZW50cnkgOiBpbnB1dCkgewotICAgICAgICAgICAgZm9yIChNYW5pZmVzdEVudHJ5IGV4cG9ydCA6IGdldE1hbmlmZXN0RW50cmllcyhtYW5pZmVzdC5nZXRFeHBvcnRzKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHMoZXhwb3J0LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnJlbW92ZShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHJlbW92ZSBpbXBvcnRzIGZvciBwYWNrYWdlcyBleHBvcnRlZCBieSB0aGUga2VybmVsCi0gICAgICAgIGZvciAoTWFuaWZlc3RFbnRyeSBlbnRyeSA6IGlucHV0KSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBleHBvcnQgOiBrZXJuZWxFeHBvcnRzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHMoZXhwb3J0KSkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXQucmVtb3ZlKGVudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVtb3ZlIGltcG9ydHMgZm9yIHBhY2thZ2VzIGV4cG9ydGVkIGJ5IHRoZSBzeXN0ZW0gYnVuZGxlCi0gICAgICAgIGZvciAoTWFuaWZlc3RFbnRyeSBlbnRyeSA6IGlucHV0KSB7Ci0gICAgICAgICAgICBpZiAoc3lzdGVtRXhwb3J0cy5jb250YWlucyhlbnRyeS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LnJlbW92ZShlbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbGxlY3Rpb248TWFuaWZlc3RFbnRyeT4gZ2V0TWFuaWZlc3RFbnRyaWVzKExpc3QgaW1wb3J0cykgewotICAgICAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExpbmtlZExpc3Q8TWFuaWZlc3RFbnRyeT4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbjxNYW5pZmVzdEVudHJ5PilpbXBvcnRzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYW5pZmVzdCBnZXRNYW5pZmVzdChBcnRpZmFjdCBhcnRpZmFjdCkgdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiwgQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbiwgWmlwRXhjZXB0aW9uLAotICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxSZXBvLnBhdGhPZihhcnRpZmFjdCkpOwotICAgICAgICBaaXBGaWxlIGZpbGU7Ci0gICAgICAgIGlmIChsb2NhbEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIC8vYXZvaWQgZ29pbmcgb3ZlciB0byB0aGUgcmVwb3NpdG9yeSBpZiB0aGUgZmlsZSBpcyBhbHJlYWR5IG9uIHRoZSBkaXNrCi0gICAgICAgICAgICBmaWxlID0gbmV3IFppcEZpbGUobG9jYWxGaWxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoYXJ0aWZhY3QsIHJlbW90ZVJlcG9zLCBsb2NhbFJlcG8pOwotICAgICAgICAgICAgZmlsZSA9IG5ldyBaaXBGaWxlKGFydGlmYWN0LmdldEZpbGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdChmaWxlLmdldElucHV0U3RyZWFtKGZpbGUuZ2V0RW50cnkoIk1FVEEtSU5GL01BTklGRVNULk1GIikpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8QXJ0aWZhY3Q+IGdldERlcGVuZGVuY2llcyhBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICBMaXN0PEFydGlmYWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdD4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlc29sdXRpb25Hcm91cCBwb20gPSBhcnRpZmFjdE1ldGFkYXRhU291cmNlLnJldHJpZXZlKGFydGlmYWN0LCBsb2NhbFJlcG8sIHJlbW90ZVJlcG9zKTsKLSAgICAgICAgICAgIGlmIChwb20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKHBvbS5nZXRBcnRpZmFjdHMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFydGlmYWN0TWV0YWRhdGFSZXRyaWV2YWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIG1ldGFkYXRhIGZvciAiICsgYXJ0aWZhY3QgKyAiLCBub3QgaW5jbHVkaW5nIGRlcGVuZGVuY2llcyBmb3IgaXQiKTsKLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZEFydGlmYWN0UlRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIG1ldGFkYXRhIGZvciAiICsgYXJ0aWZhY3QgKyAiLCBub3QgaW5jbHVkaW5nIGRlcGVuZGVuY2llcyBmb3IgaXQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzLyVzLyVzIiwgYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpLCBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCksIGFydGlmYWN0LmdldFZlcnNpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGZWF0dXJlIHsKLQotICAgICAgICBwcml2YXRlIFN0YWNrPEFydGlmYWN0PiBhcnRpZmFjdHMgPSBuZXcgU3RhY2s8QXJ0aWZhY3Q+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJ0aWZhY3QgYXJ0aWZhY3Q7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZlYXR1cmUoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLmFydGlmYWN0ID0gYXJ0aWZhY3Q7Ci0gICAgICAgICAgICBhcnRpZmFjdHMucHVzaChhcnRpZmFjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBwdXNoKEFydGlmYWN0IGl0ZW0pIHsKLSAgICAgICAgICAgIGlmIChhcnRpZmFjdHMuY29udGFpbnMoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdHMucmVtb3ZlKGl0ZW0pOwotICAgICAgICAgICAgICAgIGFydGlmYWN0cy5wdXNoKGl0ZW0pOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYXJ0aWZhY3RzLmNvbnRhaW5zKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3RzLnB1c2goaXRlbSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCIgIDxmZWF0dXJlIG5hbWU9JyIgKyBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKyAiJyB2ZXJzaW9uPSciCi0gICAgICAgICAgICAJCSsgYXJ0aWZhY3QuZ2V0QmFzZVZlcnNpb24oKSArICInPiIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdGFjazxBcnRpZmFjdD4gcmVzdWx0aW5nID0gbmV3IFN0YWNrPEFydGlmYWN0PigpOwotICAgICAgICAgICAgcmVzdWx0aW5nLmFkZEFsbChhcnRpZmFjdHMpOwotCi0gICAgICAgICAgICAvLyByZW1vdmUgZGVwZW5kZW5jaWVzIGZvciBpbmNsdWRlZCBmZWF0dXJlcwotICAgICAgICAgICAgZm9yIChBcnRpZmFjdCBuZXh0IDogYXJ0aWZhY3RzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmVhdHVyZShuZXh0KSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmcucmVtb3ZlQWxsKGZlYXR1cmVzLmdldChuZXh0KS5nZXREZXBlbmRlbmNpZXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoIXJlc3VsdGluZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIAlBcnRpZmFjdCBuZXh0ID0gcmVzdWx0aW5nLnBvcCgpOwotICAgICAgICAgICAgICAgIGlmIChpc0ZlYXR1cmUobmV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICA8ZmVhdHVyZSB2ZXJzaW9uPSciCi0gICAgICAgICAgICAJCSsgbmV4dC5nZXRCYXNlVmVyc2lvbigpICsgIic+IiArIFN0cmluZy5mb3JtYXQoIiVzPC9mZWF0dXJlPiIsIG5leHQuZ2V0QXJ0aWZhY3RJZCgpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIAkJb3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiICAgIDxidW5kbGU+bXZuOiVzLyVzLyVzPC9idW5kbGU+IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5nZXRHcm91cElkKCksIG5leHQuZ2V0QXJ0aWZhY3RJZCgpLCBuZXh0LmdldEJhc2VWZXJzaW9uKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiICA8L2ZlYXR1cmU+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBMaXN0PEFydGlmYWN0PiBnZXREZXBlbmRlbmNpZXMoKSB7Ci0gICAgICAgICAgICBMaXN0PEFydGlmYWN0PiBkZXBlbmRlbmNpZXMgPSBuZXcgTGlua2VkTGlzdDxBcnRpZmFjdD4oYXJ0aWZhY3RzKTsKLSAgICAgICAgICAgIGRlcGVuZGVuY2llcy5yZW1vdmUoYXJ0aWZhY3QpOwotICAgICAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC90b29saW5nL2ZlYXR1cmVzL0dyYXBoQXJ0aWZhY3RDb2xsZWN0b3IuamF2YSBiL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC90b29saW5nL2ZlYXR1cmVzL0dyYXBoQXJ0aWZhY3RDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzZDkzYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9HcmFwaEFydGlmYWN0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZy5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWV0YWRhdGEuQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLkFydGlmYWN0TWV0YWRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5tZXRhZGF0YS5SZXNvbHV0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0Q29sbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3RSZXNvbHV0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQ3ljbGljRGVwZW5kZW5jeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLlJlc29sdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLlJlc29sdXRpb25Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLkFydGlmYWN0RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5BcnRpZmFjdFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLk92ZXJDb25zdHJhaW5lZFZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLlZlcnNpb25SYW5nZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEFydGlmYWN0Q29sbGVjdG9yIGltcGxlbWVudHMgQXJ0aWZhY3RDb2xsZWN0b3IgewotICAgIHB1YmxpYyBBcnRpZmFjdFJlc29sdXRpb25SZXN1bHQgY29sbGVjdCgKLSAgICAgICAgICAgIFNldCBhcnRpZmFjdHMsCi0gICAgICAgICAgICBBcnRpZmFjdCBvcmlnaW5hdGluZ0FydGlmYWN0LAotICAgICAgICAgICAgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeSwKLSAgICAgICAgICAgIExpc3QgcmVtb3RlUmVwb3NpdG9yaWVzLAotICAgICAgICAgICAgQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSBzb3VyY2UsCi0gICAgICAgICAgICBBcnRpZmFjdEZpbHRlciBmaWx0ZXIsCi0gICAgICAgICAgICBMaXN0IGxpc3RlbmVycykgdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0KGFydGlmYWN0cywgb3JpZ2luYXRpbmdBcnRpZmFjdCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLAotICAgICAgICAgICAgICAgIGxvY2FsUmVwb3NpdG9yeSwgcmVtb3RlUmVwb3NpdG9yaWVzLCBzb3VyY2UsIGZpbHRlciwgbGlzdGVuZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJ0aWZhY3RSZXNvbHV0aW9uUmVzdWx0IGNvbGxlY3QoCi0gICAgICAgICAgICBTZXQgYXJ0aWZhY3RzLAotICAgICAgICAgICAgQXJ0aWZhY3Qgb3JpZ2luYXRpbmdBcnRpZmFjdCwKLSAgICAgICAgICAgIE1hcCBtYW5hZ2VkVmVyc2lvbnMsCi0gICAgICAgICAgICBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5LAotICAgICAgICAgICAgTGlzdCByZW1vdGVSZXBvc2l0b3JpZXMsCi0gICAgICAgICAgICBBcnRpZmFjdE1ldGFkYXRhU291cmNlIHNvdXJjZSwKLSAgICAgICAgICAgIEFydGlmYWN0RmlsdGVyIGZpbHRlciwKLSAgICAgICAgICAgIExpc3QgbGlzdGVuZXJzKSB0aHJvd3MgQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIHJlc29sdmVkQXJ0aWZhY3RzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBSZXNvbHV0aW9uTm9kZSByb290ID0gbmV3IFJlc29sdXRpb25Ob2RlKG9yaWdpbmF0aW5nQXJ0aWZhY3QsIHJlbW90ZVJlcG9zaXRvcmllcyk7Ci0gICAgICAgIHJvb3QuYWRkRGVwZW5kZW5jaWVzKGFydGlmYWN0cywgcmVtb3RlUmVwb3NpdG9yaWVzLCBmaWx0ZXIpOwotICAgICAgICByZWN1cnNlKHJvb3QsIHJlc29sdmVkQXJ0aWZhY3RzLCBtYW5hZ2VkVmVyc2lvbnMsIGxvY2FsUmVwb3NpdG9yeSwKLSAgICAgICAgICAgICAgICByZW1vdGVSZXBvc2l0b3JpZXMsIHNvdXJjZSwgZmlsdGVyLCBsaXN0ZW5lcnMpOwotCi0gICAgICAgIFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlZEFydGlmYWN0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIExpc3Qgbm9kZXMgPSAoTGlzdCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBub2Rlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBSZXNvbHV0aW9uTm9kZSBub2RlID0gKFJlc29sdXRpb25Ob2RlKSBqLm5leHQoKTsKLSAgICAgICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IG5vZGUuZ2V0QXJ0aWZhY3QoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5vZGUuZXF1YWxzKHJvb3QpICYmIG5vZGUuaXNBY3RpdmUoKSAmJiBub2RlLmZpbHRlclRyYWlsKGZpbHRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBvcHRpb25hbCBhbmQgbm90IGEgZGlyZWN0IGRlcGVuZGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBhZGQgaXQgb3IgaXRzIGNoaWxkcmVuLCBqdXN0IGFsbG93IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG9mIHRoZSB2ZXJzaW9uIGFuZCBzY29wZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG5vZGUuaXNDaGlsZE9mUm9vdE5vZGUoKSB8fCAhYXJ0aWZhY3QuaXNPcHRpb25hbCgpKSkgewotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdC5zZXREZXBlbmRlbmN5VHJhaWwobm9kZS5nZXREZXBlbmRlbmN5VHJhaWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQobm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQXJ0aWZhY3RSZXNvbHV0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBBcnRpZmFjdFJlc29sdXRpb25SZXN1bHQoKTsKLSAgICAgICAgcmVzdWx0LnNldEFydGlmYWN0UmVzb2x1dGlvbk5vZGVzKHNldCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlY3Vyc2UoCi0gICAgICAgICAgICBSZXNvbHV0aW9uTm9kZSBub2RlLAotICAgICAgICAgICAgTWFwIHJlc29sdmVkQXJ0aWZhY3RzLAotICAgICAgICAgICAgTWFwIG1hbmFnZWRWZXJzaW9ucywKLSAgICAgICAgICAgIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnksCi0gICAgICAgICAgICBMaXN0IHJlbW90ZVJlcG9zaXRvcmllcywKLSAgICAgICAgICAgIEFydGlmYWN0TWV0YWRhdGFTb3VyY2Ugc291cmNlLAotICAgICAgICAgICAgQXJ0aWZhY3RGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgTGlzdCBsaXN0ZW5lcnMpIHRocm93cyBDeWNsaWNEZXBlbmRlbmN5RXhjZXB0aW9uLCBBcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBPdmVyQ29uc3RyYWluZWRWZXJzaW9uRXhjZXB0aW9uIHsKLSAgICAgICAgZmlyZUV2ZW50KFJlc29sdXRpb25MaXN0ZW5lci5URVNUX0FSVElGQUNULCBsaXN0ZW5lcnMsIG5vZGUpOwotCi0gICAgICAgIC8vIFRPRE86IHVzZSBhcyBhIGNvbmZsaWN0IHJlc29sdmVyCi0gICAgICAgIE9iamVjdCBrZXkgPSBub2RlLmdldEtleSgpOwotICAgICAgICBpZiAobWFuYWdlZFZlcnNpb25zLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBtYW5hZ2VkVmVyc2lvbnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICBmaXJlRXZlbnQoUmVzb2x1dGlvbkxpc3RlbmVyLk1BTkFHRV9BUlRJRkFDVCwgbGlzdGVuZXJzLCBub2RlLCBhcnRpZmFjdCk7Ci0gICAgICAgICAgICBpZiAoYXJ0aWZhY3QuZ2V0VmVyc2lvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBub2RlLmdldEFydGlmYWN0KCkuc2V0VmVyc2lvbihhcnRpZmFjdC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFydGlmYWN0LmdldFNjb3BlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5vZGUuZ2V0QXJ0aWZhY3QoKS5zZXRTY29wZShhcnRpZmFjdC5nZXRTY29wZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgcHJldmlvdXNOb2RlcyA9IChMaXN0KSByZXNvbHZlZEFydGlmYWN0cy5nZXQoa2V5KTsKLSAgICAgICAgaWYgKHByZXZpb3VzTm9kZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbm9kZSA9IGNoZWNrUHJldmlvdXNOb2Rlcyhub2RlLCBsaXN0ZW5lcnMsIHByZXZpb3VzTm9kZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcHJldmlvdXNOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHJlc29sdmVkQXJ0aWZhY3RzLnB1dChrZXksIHByZXZpb3VzTm9kZXMpOwotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzTm9kZXMuYWRkKG5vZGUpOwotCi0gICAgICAgIGlmIChub2RlLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIGZpcmVFdmVudChSZXNvbHV0aW9uTGlzdGVuZXIuSU5DTFVERV9BUlRJRkFDVCwgbGlzdGVuZXJzLCBub2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvbid0IHB1bGwgaW4gdGhlIHRyYW5zaXRpdmUgZGVwcyBvZiBhIHN5c3RlbS1zY29wZWQgZGVwZW5kZW5jeS4KLSAgICAgICAgaWYgKG5vZGUuaXNBY3RpdmUoKSAmJiAhQXJ0aWZhY3QuU0NPUEVfU1lTVEVNLmVxdWFscyhub2RlLmdldEFydGlmYWN0KCkuZ2V0U2NvcGUoKSkpIHsKLSAgICAgICAgICAgIGZpcmVFdmVudChSZXNvbHV0aW9uTGlzdGVuZXIuUFJPQ0VTU19DSElMRFJFTiwgbGlzdGVuZXJzLCBub2RlKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGUuZ2V0Q2hpbGRyZW5JdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBSZXNvbHV0aW9uTm9kZSBjaGlsZCA9IChSZXNvbHV0aW9uTm9kZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbGVhdmUgaW4gb3B0aW9uYWwgb25lcywgYnV0IGRvbid0IHBpY2sgdXAgaXRzIGRlcGVuZGVuY2llcwotICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNSZXNvbHZlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWNoaWxkLmdldEFydGlmYWN0KCkuaXNPcHRpb25hbCgpIHx8IGNoaWxkLmlzQ2hpbGRPZlJvb3ROb2RlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gY2hpbGQuZ2V0QXJ0aWZhY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnRpZmFjdC5nZXRWZXJzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgcmVjb21tZW5kZWQgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1heWJlIGl0cyBiZXR0ZXIgdG8ganVzdCBwYXNzIHRoZSByYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdG8gcmV0cmlldmFsIGFuZCB1c2UgYSB0cmFuc2Zvcm1hdGlvbj8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdFZlcnNpb24gdmVyc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZ2V0QXJ0aWZhY3RWZXJzaW9uKGxvY2FsUmVwb3NpdG9yeSwgcmVtb3RlUmVwb3NpdG9yaWVzLCBzb3VyY2UsIGFydGlmYWN0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0LnNlbGVjdFZlcnNpb24odmVyc2lvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlRXZlbnQoUmVzb2x1dGlvbkxpc3RlbmVyLlNFTEVDVF9WRVJTSU9OX0ZST01fUkFOR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMsIGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbkdyb3VwIHJHcm91cCA9IHNvdXJjZS5yZXRyaWV2ZShhcnRpZmFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXBvc2l0b3J5LCByZW1vdGVSZXBvc2l0b3JpZXMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1pZ2h0IGJlIGJldHRlciB0byBoYXZlIHNvdXJjZS5yZXRyZWl2ZSgpIHRocm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHNwZWNpZmljIGV4Y2VwdGlvbiBmb3IgdGhpcyBzaXR1YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjYXRjaCBoZXJlIHJhdGhlciB0aGFuIGhhdmUgaXQgcmV0dXJuIG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyR3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbG9jYXRlZCBkZXBlbmRlbmN5IGFydGlmYWN0IGlzIGRlY2xhcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVkZWQsIG5vIG5lZWQgdG8gYWRkIGFuZCByZWN1cnNlIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkRGVwZW5kZW5jaWVzKHJHcm91cC5nZXRBcnRpZmFjdHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckdyb3VwLmdldFJlc29sdXRpb25SZXBvc2l0b3JpZXMoKSwgZmlsdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ3ljbGljRGVwZW5kZW5jeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBsaWtlIHRvIHRocm93IHRoaXMsIGJ1dCB3ZSBoYXZlIGNyYXBweSBzdHVmZiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcG8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUV2ZW50KFJlc29sdXRpb25MaXN0ZW5lci5PTUlUX0ZPUl9DWUNMRSwgbGlzdGVuZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb2x1dGlvbk5vZGUoZS5nZXRBcnRpZmFjdCgpLCByZW1vdGVSZXBvc2l0b3JpZXMsIGNoaWxkKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEFydGlmYWN0TWV0YWRhdGFSZXRyaWV2YWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2V0RGVwZW5kZW5jeVRyYWlsKG5vZGUuZ2V0RGVwZW5kZW5jeVRyYWlsKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGFydGlmYWN0LCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UoY2hpbGQsIHJlc29sdmVkQXJ0aWZhY3RzLCBtYW5hZ2VkVmVyc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXBvc2l0b3J5LCByZW1vdGVSZXBvc2l0b3JpZXMsIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGxpc3RlbmVycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlyZUV2ZW50KFJlc29sdXRpb25MaXN0ZW5lci5GSU5JU0hfUFJPQ0VTU0lOR19DSElMRFJFTiwgbGlzdGVuZXJzLAotICAgICAgICAgICAgICAgICAgICBub2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQXJ0aWZhY3RWZXJzaW9uIGdldEFydGlmYWN0VmVyc2lvbigKLSAgICAgICAgICAgIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnksCi0gICAgICAgICAgICBMaXN0IHJlbW90ZVJlcG9zaXRvcmllcywKLSAgICAgICAgICAgIEFydGlmYWN0TWV0YWRhdGFTb3VyY2Ugc291cmNlLAotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QpIHRocm93cyBPdmVyQ29uc3RyYWluZWRWZXJzaW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFydGlmYWN0VmVyc2lvbiB2ZXJzaW9uOwotICAgICAgICBpZiAoIWFydGlmYWN0LmlzU2VsZWN0ZWRWZXJzaW9uS25vd24oKSkgewotICAgICAgICAgICAgTGlzdCB2ZXJzaW9ucyA9IGFydGlmYWN0LmdldEF2YWlsYWJsZVZlcnNpb25zKCk7Ci0gICAgICAgICAgICBpZiAodmVyc2lvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZlcnNpb25zID0gc291cmNlLnJldHJpZXZlQXZhaWxhYmxlVmVyc2lvbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCwgbG9jYWxSZXBvc2l0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUmVwb3NpdG9yaWVzKTsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdC5zZXRBdmFpbGFibGVWZXJzaW9ucyh2ZXJzaW9ucyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UgPSBhcnRpZmFjdC5nZXRWZXJzaW9uUmFuZ2UoKTsKLQotICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25SYW5nZS5tYXRjaFZlcnNpb24odmVyc2lvbnMpOwotCi0gICAgICAgICAgICBpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb25zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3ZlckNvbnN0cmFpbmVkVmVyc2lvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gdmVyc2lvbnMgYXJlIHByZXNlbnQgaW4gdGhlIHJlcG9zaXRvcnkgZm9yIHRoZSBhcnRpZmFjdCB3aXRoIGEgcmFuZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2ZXJzaW9uUmFuZ2UsIGFydGlmYWN0LCByZW1vdGVSZXBvc2l0b3JpZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE92ZXJDb25zdHJhaW5lZFZlcnNpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgYSB2ZXJzaW9uIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmVyc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBtYXRjaCByYW5nZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZlcnNpb25SYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCwgcmVtb3RlUmVwb3NpdG9yaWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB2ZXJzaW9uID0gYXJ0aWZhY3QuZ2V0U2VsZWN0ZWRWZXJzaW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXNvbHV0aW9uTm9kZSBjaGVja1ByZXZpb3VzTm9kZXMoCi0gICAgICAgICAgICBSZXNvbHV0aW9uTm9kZSBub2RlLAotICAgICAgICAgICAgTGlzdCBsaXN0ZW5lcnMsCi0gICAgICAgICAgICBMaXN0IHByZXZpb3VzTm9kZXMpIHRocm93cyBPdmVyQ29uc3RyYWluZWRWZXJzaW9uRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJldmlvdXNOb2Rlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc29sdXRpb25Ob2RlIHByZXZpb3VzID0gKFJlc29sdXRpb25Ob2RlKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChwcmV2aW91cy5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVmVyc2lvbiBtZWRpYXRpb24KLSAgICAgICAgICAgICAgICBWZXJzaW9uUmFuZ2UgcHJldmlvdXNSYW5nZSA9IHByZXZpb3VzLmdldEFydGlmYWN0KCkuZ2V0VmVyc2lvblJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgVmVyc2lvblJhbmdlIGN1cnJlbnRSYW5nZSA9IG5vZGUuZ2V0QXJ0aWZhY3QoKS5nZXRWZXJzaW9uUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aHkgZG8gd2UgZm9yY2UgdGhlIHZlcnNpb24gb24gaXQ/IHdoYXQgaWYgdGhleQotICAgICAgICAgICAgICAgIC8vIGRvbid0IG1hdGNoPwotICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1JhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiB3YXMgYWxyZWFkeSByZXNvbHZlZAotICAgICAgICAgICAgICAgICAgICBub2RlLmdldEFydGlmYWN0KCkuc2V0VmVyc2lvbihwcmV2aW91cy5nZXRBcnRpZmFjdCgpLmdldFZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRSYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gd2FzIGFscmVhZHkgcmVzb2x2ZWQKLSAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMuZ2V0QXJ0aWZhY3QoKS5zZXRWZXJzaW9uKG5vZGUuZ2V0QXJ0aWZhY3QoKS5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkbid0IG5lZWQgdG8gZG91YmxlIHVwIG9uIHRoaXMgd29yaywgb25seQotICAgICAgICAgICAgICAgICAgICAvLyBkb25lIGZvciBzaW1wbGljaXR5IG9mIGhhbmRsaW5nIHJlY29tbWVuZGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gYnV0IHRoZSByZXN0cmljdGlvbiBpcyBpZGVudGljYWwKLSAgICAgICAgICAgICAgICAgICAgVmVyc2lvblJhbmdlIG5ld1JhbmdlID0gcHJldmlvdXNSYW5nZS5yZXN0cmljdChjdXJyZW50UmFuZ2UpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpY2suIHRoaXMgZm9yY2VzIHRoZSBPQ0UgdGhhdCBzaG91bGQgaGF2ZSBjb21lCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuIEl0IGlzIHN0aWxsIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JhbmdlLmlzU2VsZWN0ZWRWZXJzaW9uS25vd24ocHJldmlvdXMuZ2V0QXJ0aWZhY3QoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVFdmVudChSZXNvbHV0aW9uTGlzdGVuZXIuUkVTVFJJQ1RfUkFOR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycywgbm9kZSwgcHJldmlvdXMuZ2V0QXJ0aWZhY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmFuZ2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLmdldEFydGlmYWN0KCkuc2V0VmVyc2lvblJhbmdlKG5ld1JhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRBcnRpZmFjdCgpLnNldFZlcnNpb25SYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UucmVzdHJpY3QocHJldmlvdXNSYW5nZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCBhbiBhcHByb3ByaWF0ZSBhdmFpbGFibGUgdmVyc2lvbiBmcm9tIHRoZSAobm93Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3RyaWN0ZWQpIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhpcyB2ZXJzaW9uIHdhcyBzZWxlY3RlZCBiZWZvcmUgdG8gZ2V0IHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBhcHByb3ByaWF0ZSBQT00KLSAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGl0IHdhcyByZXNldCBieSB0aGUgY2FsbCB0byBzZXRWZXJzaW9uUmFuZ2Ugb24KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzdHJpY3RpbmcgdGhlIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbk5vZGVbXSByZXNldE5vZGVzID0ge3ByZXZpb3VzLCBub2RlfTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0IHJlc2V0QXJ0aWZhY3QgPSByZXNldE5vZGVzW2pdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBcnRpZmFjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2V0QXJ0aWZhY3QuZ2V0VmVyc2lvbigpID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzZXRBcnRpZmFjdC5nZXRWZXJzaW9uUmFuZ2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc2V0QXJ0aWZhY3QuZ2V0QXZhaWxhYmxlVmVyc2lvbnMoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldEFydGlmYWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0VmVyc2lvbihyZXNldEFydGlmYWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWZXJzaW9uUmFuZ2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2hWZXJzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0QXJ0aWZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdmFpbGFibGVWZXJzaW9ucygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUV2ZW50KFJlc29sdXRpb25MaXN0ZW5lci5TRUxFQ1RfVkVSU0lPTl9GUk9NX1JBTkdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLCByZXNldE5vZGVzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENvbmZsaWN0IFJlc29sdXRpb24KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgYXMgY29uZmxpY3QgcmVzb2x2ZXIocyksIGNoYWluCi0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBwYXJ0IG9mIG1lZGlhdGlvbj8KLSAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBvbmUgaXMgbW9yZSBkb21pbmFudAotICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cy5nZXREZXB0aCgpIDw9IG5vZGUuZ2V0RGVwdGgoKSkgewotICAgICAgICAgICAgICAgICAgICBjaGVja1Njb3BlVXBkYXRlKG5vZGUsIHByZXZpb3VzLCBsaXN0ZW5lcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tTY29wZVVwZGF0ZShwcmV2aW91cywgbm9kZSwgbGlzdGVuZXJzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMuZ2V0RGVwdGgoKSA8PSBub2RlLmdldERlcHRoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgd2FzIG5lYXJlcgotICAgICAgICAgICAgICAgICAgICBmaXJlRXZlbnQoUmVzb2x1dGlvbkxpc3RlbmVyLk9NSVRfRk9SX05FQVJFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMsIG5vZGUsIHByZXZpb3VzLmdldEFydGlmYWN0KCkpOwotICAgICAgICAgICAgICAgICAgICBub2RlLmRpc2FibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHByZXZpb3VzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyZUV2ZW50KFJlc29sdXRpb25MaXN0ZW5lci5PTUlUX0ZPUl9ORUFSRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLCBwcmV2aW91cywgbm9kZS5nZXRBcnRpZmFjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMuZGlzYWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tTY29wZVVwZGF0ZShSZXNvbHV0aW9uTm9kZSBmYXJ0aGVzdCwKLSAgICAgICAgICAgIFJlc29sdXRpb25Ob2RlIG5lYXJlc3QsIExpc3QgbGlzdGVuZXJzKSB7Ci0gICAgICAgIGJvb2xlYW4gdXBkYXRlU2NvcGUgPSBmYWxzZTsKLSAgICAgICAgQXJ0aWZhY3QgZmFydGhlc3RBcnRpZmFjdCA9IGZhcnRoZXN0LmdldEFydGlmYWN0KCk7Ci0gICAgICAgIEFydGlmYWN0IG5lYXJlc3RBcnRpZmFjdCA9IG5lYXJlc3QuZ2V0QXJ0aWZhY3QoKTsKLQotICAgICAgICBpZiAoQXJ0aWZhY3QuU0NPUEVfUlVOVElNRS5lcXVhbHMoZmFydGhlc3RBcnRpZmFjdC5nZXRTY29wZSgpKQotICAgICAgICAgICAgICAgICYmIChBcnRpZmFjdC5TQ09QRV9URVNULmVxdWFscyhuZWFyZXN0QXJ0aWZhY3QuZ2V0U2NvcGUoKSkgfHwgQXJ0aWZhY3QuU0NPUEVfUFJPVklERUQKLSAgICAgICAgICAgICAgICAuZXF1YWxzKG5lYXJlc3RBcnRpZmFjdC5nZXRTY29wZSgpKSkpIHsKLSAgICAgICAgICAgIHVwZGF0ZVNjb3BlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChBcnRpZmFjdC5TQ09QRV9DT01QSUxFLmVxdWFscyhmYXJ0aGVzdEFydGlmYWN0LmdldFNjb3BlKCkpCi0gICAgICAgICAgICAgICAgJiYgIUFydGlmYWN0LlNDT1BFX0NPTVBJTEUuZXF1YWxzKG5lYXJlc3RBcnRpZmFjdC5nZXRTY29wZSgpKSkgewotICAgICAgICAgICAgdXBkYXRlU2NvcGUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3VycmVudCBQT00gcnVsZXMgYWxsCi0gICAgICAgIGlmIChuZWFyZXN0LmdldERlcHRoKCkgPCAyICYmIHVwZGF0ZVNjb3BlKSB7Ci0gICAgICAgICAgICB1cGRhdGVTY29wZSA9IGZhbHNlOwotCi0gICAgICAgICAgICBmaXJlRXZlbnQoUmVzb2x1dGlvbkxpc3RlbmVyLlVQREFURV9TQ09QRV9DVVJSRU5UX1BPTSwgbGlzdGVuZXJzLAotICAgICAgICAgICAgICAgICAgICBuZWFyZXN0LCBmYXJ0aGVzdEFydGlmYWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1cGRhdGVTY29wZSkgewotICAgICAgICAgICAgZmlyZUV2ZW50KFJlc29sdXRpb25MaXN0ZW5lci5VUERBVEVfU0NPUEUsIGxpc3RlbmVycywgbmVhcmVzdCwKLSAgICAgICAgICAgICAgICAgICAgZmFydGhlc3RBcnRpZmFjdCk7Ci0KLSAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgd2UgY2xvbmVkIHRoZSBhcnRpZmFjdCwgYnV0IGl0IGlzIG1vcmUgZWZmZWNpZW50IHRvCi0gICAgICAgICAgICAvLyBqdXN0IHVwZGF0ZSB0aGUgc2NvcGUKLSAgICAgICAgICAgIC8vIGlmIHByb2JsZW1zIGFyZSBsYXRlciBkaXNjb3ZlcmVkIHRoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBuZWVkcwotICAgICAgICAgICAgLy8gaXRzIG9yaWdpbmFsIHNjb3BlIHZhbHVlLCBjbG9uaW5nIG1heQotICAgICAgICAgICAgLy8gYWdhaW4gYmUgYXBwcm9wcmlhdGUKLSAgICAgICAgICAgIG5lYXJlc3RBcnRpZmFjdC5zZXRTY29wZShmYXJ0aGVzdEFydGlmYWN0LmdldFNjb3BlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVFdmVudChpbnQgZXZlbnQsIExpc3QgbGlzdGVuZXJzLCBSZXNvbHV0aW9uTm9kZSBub2RlKSB7Ci0gICAgICAgIGZpcmVFdmVudChldmVudCwgbGlzdGVuZXJzLCBub2RlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlyZUV2ZW50KGludCBldmVudCwgTGlzdCBsaXN0ZW5lcnMsIFJlc29sdXRpb25Ob2RlIG5vZGUsCi0gICAgICAgICAgICBBcnRpZmFjdCByZXBsYWNlbWVudCkgewotICAgICAgICBmaXJlRXZlbnQoZXZlbnQsIGxpc3RlbmVycywgbm9kZSwgcmVwbGFjZW1lbnQsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXJlRXZlbnQoaW50IGV2ZW50LCBMaXN0IGxpc3RlbmVycywgUmVzb2x1dGlvbk5vZGUgbm9kZSwKLSAgICAgICAgICAgIEFydGlmYWN0IHJlcGxhY2VtZW50LCBWZXJzaW9uUmFuZ2UgbmV3UmFuZ2UpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUmVzb2x1dGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFJlc29sdXRpb25MaXN0ZW5lcikgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJlc29sdXRpb25MaXN0ZW5lci5URVNUX0FSVElGQUNUOgotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci50ZXN0QXJ0aWZhY3Qobm9kZS5nZXRBcnRpZmFjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSZXNvbHV0aW9uTGlzdGVuZXIuUFJPQ0VTU19DSElMRFJFTjoKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuc3RhcnRQcm9jZXNzQ2hpbGRyZW4obm9kZS5nZXRBcnRpZmFjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSZXNvbHV0aW9uTGlzdGVuZXIuRklOSVNIX1BST0NFU1NJTkdfQ0hJTERSRU46Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVuZFByb2Nlc3NDaGlsZHJlbihub2RlLmdldEFydGlmYWN0KCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJlc29sdXRpb25MaXN0ZW5lci5JTkNMVURFX0FSVElGQUNUOgotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5pbmNsdWRlQXJ0aWZhY3Qobm9kZS5nZXRBcnRpZmFjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSZXNvbHV0aW9uTGlzdGVuZXIuT01JVF9GT1JfTkVBUkVSOgotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG5vZGUuZ2V0QXJ0aWZhY3QoKS5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXBsYWNlbWVudFZlcnNpb24gPSByZXBsYWNlbWVudC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG51bGwgPyAhdmVyc2lvbi5lcXVhbHMocmVwbGFjZW1lbnRWZXJzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVwbGFjZW1lbnRWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9taXRGb3JOZWFyZXIobm9kZS5nZXRBcnRpZmFjdCgpLCByZXBsYWNlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSZXNvbHV0aW9uTGlzdGVuZXIuT01JVF9GT1JfQ1lDTEU6Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9taXRGb3JDeWNsZShub2RlLmdldEFydGlmYWN0KCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJlc29sdXRpb25MaXN0ZW5lci5VUERBVEVfU0NPUEU6Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZVNjb3BlKG5vZGUuZ2V0QXJ0aWZhY3QoKSwgcmVwbGFjZW1lbnQuZ2V0U2NvcGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUmVzb2x1dGlvbkxpc3RlbmVyLlVQREFURV9TQ09QRV9DVVJSRU5UX1BPTToKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIudXBkYXRlU2NvcGVDdXJyZW50UG9tKG5vZGUuZ2V0QXJ0aWZhY3QoKSwgcmVwbGFjZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2NvcGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUmVzb2x1dGlvbkxpc3RlbmVyLk1BTkFHRV9BUlRJRkFDVDoKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubWFuYWdlQXJ0aWZhY3Qobm9kZS5nZXRBcnRpZmFjdCgpLCByZXBsYWNlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUmVzb2x1dGlvbkxpc3RlbmVyLlNFTEVDVF9WRVJTSU9OX0ZST01fUkFOR0U6Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlbGVjdFZlcnNpb25Gcm9tUmFuZ2Uobm9kZS5nZXRBcnRpZmFjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSZXNvbHV0aW9uTGlzdGVuZXIuUkVTVFJJQ1RfUkFOR0U6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEFydGlmYWN0KCkuZ2V0VmVyc2lvblJhbmdlKCkuaGFzUmVzdHJpY3Rpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByZXBsYWNlbWVudC5nZXRWZXJzaW9uUmFuZ2UoKS5oYXNSZXN0cmljdGlvbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIucmVzdHJpY3RSYW5nZShub2RlLmdldEFydGlmYWN0KCksIHJlcGxhY2VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5nZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5rbm93biBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC90b29saW5nL2ZlYXR1cmVzL01vam9TdXBwb3J0LmphdmEgYi9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9Nb2pvU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDJhZjNlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC90b29saW5nL2ZlYXR1cmVzL01vam9TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZy5mZWF0dXJlczsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuZmFjdG9yeS5BcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5tZXRhZGF0YS5BcnRpZmFjdE1ldGFkYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdENvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLkludmFsaWRWZXJzaW9uU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuRGVwZW5kZW5jeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLkRlcGVuZGVuY3lNYW5hZ2VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uOwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vam9TdXBwb3J0IGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKLQotICAgIC8qKgotICAgICAqIE1hdmVuIFByb2plY3RIZWxwZXIKLSAgICAgKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0SGVscGVyIHByb2plY3RIZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF2ZW4gcHJvamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RvcnkgdGhhdCByZXNvdXJjZXMgYXJlIGNvcGllZCB0byBkdXJpbmcgdGhlIGJ1aWxkLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LWluc3RhbGxlciIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSB3b3JrRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogQGNvbXBvbmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXZlblByb2plY3RCdWlsZGVyIHByb2plY3RCdWlsZGVyOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2xvY2FsUmVwb3NpdG9yeX0iCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG87Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5yZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllc30iCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgcmVtb3RlUmVwb3M7Ci0KLSAgICAvKioKLSAgICAgKiBAY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0TWV0YWRhdGFTb3VyY2UgYXJ0aWZhY3RNZXRhZGF0YVNvdXJjZTsKLQotICAgIC8qKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RSZXNvbHZlciByZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBBcnRpZmFjdENvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgR3JhcGhBcnRpZmFjdENvbGxlY3RvcigpOwotCi0gICAgLyoqCi0gICAgICogQGNvbXBvbmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBBcnRpZmFjdEZhY3RvcnkgZmFjdG9yeTsKLQotICAgIHByb3RlY3RlZCBNYXZlblByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0V29ya0RpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHdvcmtEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hdmVuUHJvamVjdEhlbHBlciBnZXRQcm9qZWN0SGVscGVyKCkgewotICAgICAgICByZXR1cm4gcHJvamVjdEhlbHBlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVCcmFuY2goUmVzb2x1dGlvbkxpc3RlbmVySW1wbCBsaXN0ZW5lciwKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0KSB7Ci0gICAgICAgIE5vZGUgbiA9IGxpc3RlbmVyLmdldE5vZGUoYXJ0aWZhY3QpOwotICAgICAgICBpZiAobiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbi5nZXRQYXJlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gKE5vZGUpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUobik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZHJlbihSZXNvbHV0aW9uTGlzdGVuZXJJbXBsIGxpc3RlbmVyLAotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgTm9kZSBuID0gbGlzdGVuZXIuZ2V0Tm9kZShhcnRpZmFjdCk7Ci0gICAgICAgIG4uZ2V0Q2hpbGRyZW4oKS5jbGVhcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXQgZ2V0QXJ0aWZhY3RzKE5vZGUgbiwgU2V0IHMpIHsKLSAgICAgICAgaWYgKCFzLmNvbnRhaW5zKG4uZ2V0QXJ0aWZhY3QoKSkpIHsKLSAgICAgICAgICAgIHMuYWRkKG4uZ2V0QXJ0aWZhY3QoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBjID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGdldEFydGlmYWN0cyhjLCBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGNsdWRlQnJhbmNoKE5vZGUgbiwgU2V0IGV4Y2x1ZGVzKSB7Ci0gICAgICAgIGV4Y2x1ZGVzLmFkZChuKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbi5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTm9kZSBjID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZXhjbHVkZUJyYW5jaChjLCBleGNsdWRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChOb2RlIHJvb3ROb2RlKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFydGlmYWN0cyhyb290Tm9kZSwgbmV3IEhhc2hTZXQoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhID0gKEFydGlmYWN0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIiAiICsgYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0IHJldGFpbkFydGlmYWN0cyhTZXQgaW5jbHVkZXMsIFJlc29sdXRpb25MaXN0ZW5lckltcGwgbGlzdGVuZXIpIHsKLSAgICAgICAgU2V0IGZpbmFsSW5jbHVkZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgZmlsdGVyZWRBcnRpZmFjdHMgPSBnZXRBcnRpZmFjdHMobGlzdGVuZXIuZ2V0Um9vdE5vZGUoKSwKLSAgICAgICAgICAgICAgICBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW5jbHVkZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gZmlsdGVyZWRBcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXRlcjIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEFydGlmYWN0IGZpbHRlcmVkQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRBcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsdGVyZWRBcnRpZmFjdC5nZXRUeXBlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhhcnRpZmFjdC5nZXRUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWx0ZXJlZEFydGlmYWN0LmdldEdyb3VwSWQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0LmdldEdyb3VwSWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJlZEFydGlmYWN0LmdldFZlcnNpb24oKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QuZ2V0VmVyc2lvbigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc29sdmVkIGFydGlmYWN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBoYXMgYSBkaWZmZXJlbnQgdmVyc2lvbiBmcm9tIHRoYXQgaW4gZGVwZW5kZW5jeSBtYW5hZ2VtZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsdGVyZWRBcnRpZmFjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBvdmVycmlkaW5nIGRlcGVuZGVuY3kgbWFuYWdlbWVudCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsSW5jbHVkZXMuYWRkKGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmaW5hbEluY2x1ZGVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSZXNvbHV0aW9uTGlzdGVuZXJJbXBsIHJlc29sdmVQcm9qZWN0KCkgewotICAgICAgICBNYXAgbWFuYWdlZFZlcnNpb25zID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hbmFnZWRWZXJzaW9ucyA9IGNyZWF0ZU1hbmFnZWRWZXJzaW9uTWFwKHByb2plY3QuZ2V0SWQoKSwgcHJvamVjdAotICAgICAgICAgICAgICAgICAgICAuZ2V0RGVwZW5kZW5jeU1hbmFnZW1lbnQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5lcnJvcigKLSAgICAgICAgICAgICAgICAgICAgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlc29sdmluZyBwcm9qZWN0IGRlcGVuZGVuY2llcy4iLAotICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgfQotICAgICAgICBSZXNvbHV0aW9uTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IFJlc29sdXRpb25MaXN0ZW5lckltcGwoKTsKLSAgICAgICAgbGlzdGVuZXIuc2V0TG9nKGdldExvZygpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbGxlY3Rvci5jb2xsZWN0KHByb2plY3QuZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpLCBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBcnRpZmFjdCgpLCBtYW5hZ2VkVmVyc2lvbnMsIGxvY2FsUmVwbywgcmVtb3RlUmVwb3MsCi0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0TWV0YWRhdGFTb3VyY2UsIG51bGwsIENvbGxlY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpbmdsZXRvbkxpc3QobGlzdGVuZXIpKTsKLSAgICAgICAgfSBjYXRjaCAoQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZygpLmVycm9yKAotICAgICAgICAgICAgICAgICAgICAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVzb2x2aW5nIHByb2plY3QgZGVwZW5kZW5jaWVzLiIsCi0gICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRMb2coKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiRGVwZW5kZW5jeSBncmFwaCIpOwotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIj09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIHByaW50KGxpc3RlbmVyLmdldFJvb3ROb2RlKCkpOwotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIj09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBjcmVhdGVNYW5hZ2VkVmVyc2lvbk1hcChTdHJpbmcgcHJvamVjdElkLAotICAgICAgICAgICAgRGVwZW5kZW5jeU1hbmFnZW1lbnQgZGVwZW5kZW5jeU1hbmFnZW1lbnQpIHRocm93cyBQcm9qZWN0QnVpbGRpbmdFeGNlcHRpb24gewotICAgICAgICBNYXAgbWFwOwotICAgICAgICBpZiAoZGVwZW5kZW5jeU1hbmFnZW1lbnQgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGRlcGVuZGVuY3lNYW5hZ2VtZW50LmdldERlcGVuZGVuY2llcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZXBlbmRlbmN5TWFuYWdlbWVudC5nZXREZXBlbmRlbmNpZXMoKS5pdGVyYXRvcigpOyBpCi0gICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgRGVwZW5kZW5jeSBkID0gKERlcGVuZGVuY3kpIGkubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZSA9IFZlcnNpb25SYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVGcm9tVmVyc2lvblNwZWMoZC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IGZhY3RvcnkuY3JlYXRlRGVwZW5kZW5jeUFydGlmYWN0KGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0R3JvdXBJZCgpLCBkLmdldEFydGlmYWN0SWQoKSwgdmVyc2lvblJhbmdlLCBkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFR5cGUoKSwgZC5nZXRDbGFzc2lmaWVyKCksIGQuZ2V0U2NvcGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoZC5nZXRNYW5hZ2VtZW50S2V5KCksIGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkVmVyc2lvblNwZWNpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uKHByb2plY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIHZlcnNpb24gJyIgKyBkLmdldFZlcnNpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBmb3IgZGVwZW5kZW5jeSAnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkLmdldE1hbmFnZW1lbnRLZXkoKSArICInOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdXAgYSBjbGFzc2xvYWRlciBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBjbGFzcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVVJMQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXQgdXJscyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgICAgIFVSTCBtYWluQ2xhc3NlcyA9IG5ldyBGaWxlKHByb2plY3QuZ2V0QnVpbGQoKS5nZXRPdXRwdXREaXJlY3RvcnkoKSkKLSAgICAgICAgICAgICAgICAgICAgLnRvVVJMKCk7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiQWRkaW5nIHRvIGNsYXNzcGF0aCA6ICIgKyBtYWluQ2xhc3Nlcyk7Ci0gICAgICAgICAgICB1cmxzLmFkZChtYWluQ2xhc3Nlcyk7Ci0KLSAgICAgICAgICAgIFVSTCB0ZXN0Q2xhc3NlcyA9IG5ldyBGaWxlKHByb2plY3QuZ2V0QnVpbGQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0VGVzdE91dHB1dERpcmVjdG9yeSgpKS50b1VSTCgpOwotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkFkZGluZyB0byBjbGFzc3BhdGggOiAiICsgdGVzdENsYXNzZXMpOwotICAgICAgICAgICAgdXJscy5hZGQodGVzdENsYXNzZXMpOwotCi0gICAgICAgICAgICBTZXQgZGVwZW5kZW5jaWVzID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEFydGlmYWN0IGNsYXNzUGF0aEVsZW1lbnQgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkFkZGluZyBhcnRpZmFjdDogIiArIGNsYXNzUGF0aEVsZW1lbnQuZ2V0RmlsZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgICAgICB1cmxzLmFkZChjbGFzc1BhdGhFbGVtZW50LmdldEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFVSTENsYXNzTG9hZGVyIGFwcENsYXNzbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKChVUkxbXSkgdXJscwotICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSksIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBhcHBDbGFzc2xvYWRlcjsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZHVyaW5nIHNldHRpbmcgdXAgY2xhc3NwYXRoIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9Ob2RlLmphdmEgYi9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjA5MzkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L3Rvb2xpbmcvZmVhdHVyZXMvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZy5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKLSovCi1wdWJsaWMgY2xhc3MgTm9kZSB7Ci0gICAgcHJpdmF0ZSBTZXQgY2hpbGRyZW4gPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgU2V0IHBhcmVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgQXJ0aWZhY3QgYXJ0aWZhY3Q7Ci0KLSAgICBwdWJsaWMgU2V0IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgcHVibGljIEFydGlmYWN0IGdldEFydGlmYWN0KCkgewotICAgICAgICByZXR1cm4gYXJ0aWZhY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBnZXRQYXJlbnRzKCkgewotICAgICAgICByZXR1cm4gcGFyZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihTZXQgY2hpbGRyZW4pIHsKLSAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudHMoU2V0IHBhcmVudHMpIHsKLSAgICAgICAgdGhpcy5wYXJlbnRzID0gcGFyZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdChBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICB0aGlzLmFydGlmYWN0ID0gYXJ0aWZhY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L3Rvb2xpbmcvZmVhdHVyZXMvUmVzb2x1dGlvbkxpc3RlbmVySW1wbC5qYXZhIGIvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L3Rvb2xpbmcvZmVhdHVyZXMvUmVzb2x1dGlvbkxpc3RlbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmY1ZTFhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC90b29saW5nL2ZlYXR1cmVzL1Jlc29sdXRpb25MaXN0ZW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLlJlc29sdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotCi0vKioKLSAqIEBhdXRob3IgRWR3aW4gUHVuemFsYW4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQKLSAqLwotcHVibGljIGNsYXNzIFJlc29sdXRpb25MaXN0ZW5lckltcGwgaW1wbGVtZW50cyBSZXNvbHV0aW9uTGlzdGVuZXIgewotICAgIHByaXZhdGUgU3RhY2sgcGFyZW50cyA9IG5ldyBTdGFjaygpOwotICAgIHByaXZhdGUgTWFwIGFydGlmYWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBOb2RlIHJvb3ROb2RlOwotICAgIHByaXZhdGUgTG9nIGxvZzsKLQotICAgIHB1YmxpYyB2b2lkIHNldExvZyhMb2cgbG9nKSB7Ci0gICAgICAgIHRoaXMubG9nID0gbG9nOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2cgZ2V0TG9nKCkgewotICAgICAgICByZXR1cm4gbG9nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnRpZmFjdChBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICAvLyBnZXRMb2coKS5kZWJ1ZygidGVzdEFydGlmYWN0OiAiICsgYXJ0aWZhY3QpOwotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9jZXNzQ2hpbGRyZW4oQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgLy8gZ2V0TG9nKCkuZGVidWcoInN0YXJ0UHJvY2Vzc0NoaWxkcmVuOiAiICsgYXJ0aWZhY3QpOwotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgYXJ0aWZhY3RzLmdldChhcnRpZmFjdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpKTsKLSAgICAgICAgaWYgKHBhcmVudHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByb290Tm9kZSA9IG5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb2Nlc3NDaGlsZHJlbihBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICAvLyBnZXRMb2coKS5kZWJ1ZygiZW5kUHJvY2Vzc0NoaWxkcmVuOiAiICsgYXJ0aWZhY3QpOwotICAgICAgICBOb2RlIGNoZWNrID0gKE5vZGUpIHBhcmVudHMucG9wKCk7Ci0gICAgICAgIGFzc2VydCBhcnRpZmFjdC5lcXVhbHMoY2hlY2suZ2V0QXJ0aWZhY3QoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb21pdEZvck5lYXJlcihBcnRpZmFjdCBvbWl0dGVkLCBBcnRpZmFjdCBrZXB0KSB7Ci0gICAgICAgIC8vIGdldExvZygpLmRlYnVnKCJvbWl0Rm9yTmVhcmVyOiBvbWl0dGVkPSIgKyBvbWl0dGVkICsgIiwga2VwdD0iICsKLSAgICAgICAgLy8ga2VwdCk7Ci0gICAgICAgIGFzc2VydCBvbWl0dGVkLmdldERlcGVuZGVuY3lDb25mbGljdElkKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgIGtlcHQuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBhcnRpZmFjdHMuZ2V0KG9taXR0ZWQuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0gICAgICAgIGFzc2VydCBub2RlICE9IG51bGw7Ci0gICAgICAgIG5vZGUuc2V0QXJ0aWZhY3Qoa2VwdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb21pdEZvckN5Y2xlKEFydGlmYWN0IGFydGlmYWN0KSB7Ci0gICAgICAgIC8vIGdldExvZygpLmRlYnVnKCJvbWl0Rm9yQ3ljbGU6ICIgKyBhcnRpZmFjdCk7Ci0gICAgICAgIC8vIGludGVudGlvbmFsbHkgYmxhbmsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbmNsdWRlQXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgLy8gZ2V0TG9nKCkuZGVidWcoImluY2x1ZGVBcnRpZmFjdDogIiArIGFydGlmYWN0KTsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGFydGlmYWN0cy5nZXQoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0gICAgICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZSgpOwotICAgICAgICAgICAgYXJ0aWZhY3RzLnB1dChhcnRpZmFjdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpLCBub2RlKTsKLSAgICAgICAgfQotICAgICAgICBub2RlLnNldEFydGlmYWN0KGFydGlmYWN0KTsKLSAgICAgICAgaWYgKCFwYXJlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgTm9kZSBwYXJlbnQgPSAoTm9kZSkgcGFyZW50cy5wZWVrKCk7Ci0gICAgICAgICAgICBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5hZGQobm9kZSk7Ci0gICAgICAgICAgICBub2RlLmdldFBhcmVudHMoKS5hZGQocGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm9vdE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gcHJpbnQocm9vdE5vZGUsICIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50KE5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotICAgICAgICAvLyBnZXRMb2coKS5kZWJ1ZyhzdHJpbmcgKyByb290Tm9kZS5nZXRBcnRpZmFjdCgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTm9kZSBuID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgcHJpbnQobiwgc3RyaW5nICsgIiAgIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVTY29wZShBcnRpZmFjdCBhcnRpZmFjdCwgU3RyaW5nIHNjb3BlKSB7Ci0gICAgICAgIC8vIGdldExvZygpLmRlYnVnKCJ1cGRhdGVTY29wZTogIiArIGFydGlmYWN0KTsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGFydGlmYWN0cy5nZXQoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0KLSAgICAgICAgbm9kZS5nZXRBcnRpZmFjdCgpLnNldFNjb3BlKHNjb3BlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtYW5hZ2VBcnRpZmFjdChBcnRpZmFjdCBhcnRpZmFjdCwgQXJ0aWZhY3QgcmVwbGFjZW1lbnQpIHsKLSAgICAgICAgLy8gZ2V0TG9nKCkuZGVidWcoIm1hbmFnZUFydGlmYWN0OiBhcnRpZmFjdD0iICsgYXJ0aWZhY3QgKyAiLAotICAgICAgICAvLyByZXBsYWNlbWVudD0iICsgcmVwbGFjZW1lbnQpOwotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgYXJ0aWZhY3RzLmdldChhcnRpZmFjdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpKTsKLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50LmdldFZlcnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbm9kZS5nZXRBcnRpZmFjdCgpLnNldFZlcnNpb24ocmVwbGFjZW1lbnQuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudC5nZXRTY29wZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBub2RlLmdldEFydGlmYWN0KCkuc2V0U2NvcGUocmVwbGFjZW1lbnQuZ2V0U2NvcGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVTY29wZUN1cnJlbnRQb20oQXJ0aWZhY3QgYXJ0aWZhY3QsIFN0cmluZyBrZXkpIHsKLQotICAgICAgICBnZXRMb2coKS5kZWJ1ZygidXBkYXRlU2NvcGVDdXJyZW50UG9tOiAiICsgYXJ0aWZhY3QpOwotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0VmVyc2lvbkZyb21SYW5nZShBcnRpZmFjdCBhcnRpZmFjdCkgewotCi0gICAgICAgIGdldExvZygpLmRlYnVnKCJzZWxlY3RWZXJzaW9uRnJvbVJhbmdlOiAiICsgYXJ0aWZhY3QpOwotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzdHJpY3RSYW5nZShBcnRpZmFjdCBhcnRpZmFjdCwgQXJ0aWZhY3QgYXJ0aWZhY3QxLAotICAgICAgICAgICAgVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZSkgewotCi0gICAgICAgIGdldExvZygpLmRlYnVnKCJyZXN0cmljdFJhbmdlOiAiICsgYXJ0aWZhY3QpOwotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rCi0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0Tm9kZShBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICByZXR1cm4gKE5vZGUpIGFydGlmYWN0cy5nZXQoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0QXJ0aWZhY3RzKCkgewotICAgICAgICByZXR1cm4gYXJ0aWZhY3RzLnZhbHVlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFJvb3ROb2RlKCkgewotICAgICAgICByZXR1cm4gcm9vdE5vZGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcucHJvcGVydGllcyBiL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOTNkMTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi1qcmUtMS41PSBcCi0gamF2YXguYWNjZXNzaWJpbGl0eTsgXAotIGphdmF4LmFjdGl2aXR5OyBcCi0gamF2YXguY3J5cHRvOyBcCi0gamF2YXguY3J5cHRvLmludGVyZmFjZXM7IFwKLSBqYXZheC5jcnlwdG8uc3BlYzsgXAotIGphdmF4LmltYWdlaW87IFwKLSBqYXZheC5pbWFnZWlvLmV2ZW50OyBcCi0gamF2YXguaW1hZ2Vpby5tZXRhZGF0YTsgXAotIGphdmF4LmltYWdlaW8ucGx1Z2lucy5ibXA7IFwKLSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuanBlZzsgXAotIGphdmF4LmltYWdlaW8uc3BpOyBcCi0gamF2YXguaW1hZ2Vpby5zdHJlYW07IFwKLSBqYXZheC5tYW5hZ2VtZW50OyBcCi0gamF2YXgubWFuYWdlbWVudC5sb2FkaW5nOyBcCi0gamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuOyBcCi0gamF2YXgubWFuYWdlbWVudC5tb25pdG9yOyBcCi0gamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW47IFwKLSBqYXZheC5tYW5hZ2VtZW50LnJlbGF0aW9uOyBcCi0gamF2YXgubWFuYWdlbWVudC5yZW1vdGU7IFwKLSBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWk7IFwKLSBqYXZheC5tYW5hZ2VtZW50LnRpbWVyOyBcCi0gamF2YXgubmFtaW5nOyBcCi0gamF2YXgubmFtaW5nLmRpcmVjdG9yeTsgXAotIGphdmF4Lm5hbWluZy5ldmVudDsgXAotIGphdmF4Lm5hbWluZy5sZGFwOyBcCi0gamF2YXgubmFtaW5nLnNwaTsgXAotIGphdmF4Lm5ldDsgXAotIGphdmF4Lm5ldC5zc2w7IFwKLSBqYXZheC5wcmludDsgXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZTsgXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZS5zdGFuZGFyZDsgXAotIGphdmF4LnByaW50LmV2ZW50OyBcCi0gamF2YXgucm1pOyBcCi0gamF2YXgucm1pLkNPUkJBOyBcCi0gamF2YXgucm1pLnNzbDsgXAotIGphdmF4LnNlY3VyaXR5LmF1dGg7IFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrOyBcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvczsgXAotIGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW47IFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLnNwaTsgXAotIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMDsgXAotIGphdmF4LnNlY3VyaXR5LmNlcnQ7IFwKLSBqYXZheC5zZWN1cml0eS5zYXNsOyBcCi0gamF2YXguc291bmQubWlkaTsgXAotIGphdmF4LnNvdW5kLm1pZGkuc3BpOyBcCi0gamF2YXguc291bmQuc2FtcGxlZDsgXAotIGphdmF4LnNvdW5kLnNhbXBsZWQuc3BpOyBcCi0gamF2YXguc3FsOyBcCi0gamF2YXguc3FsLnJvd3NldDsgXAotIGphdmF4LnNxbC5yb3dzZXQuc2VyaWFsOyBcCi0gamF2YXguc3FsLnJvd3NldC5zcGk7IFwKLSBqYXZheC5zd2luZzsgXAotIGphdmF4LnN3aW5nLmJvcmRlcjsgXAotIGphdmF4LnN3aW5nLmNvbG9yY2hvb3NlcjsgXAotIGphdmF4LnN3aW5nLmV2ZW50OyBcCi0gamF2YXguc3dpbmcuZmlsZWNob29zZXI7IFwKLSBqYXZheC5zd2luZy5wbGFmOyBcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYzsgXAotIGphdmF4LnN3aW5nLnBsYWYubWV0YWw7IFwKLSBqYXZheC5zd2luZy5wbGFmLm11bHRpOyBcCi0gamF2YXguc3dpbmcucGxhZi5zeW50aDsgXAotIGphdmF4LnN3aW5nLnRhYmxlOyBcCi0gamF2YXguc3dpbmcudGV4dDsgXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbDsgXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXI7IFwKLSBqYXZheC5zd2luZy50ZXh0LnJ0ZjsgXAotIGphdmF4LnN3aW5nLnRyZWU7IFwKLSBqYXZheC5zd2luZy51bmRvOyBcCi0gamF2YXgueG1sOyBcCi0gamF2YXgueG1sLmRhdGF0eXBlOyBcCi0gamF2YXgueG1sLm5hbWVzcGFjZTsgXAotIGphdmF4LnhtbC5wYXJzZXJzOyBcCi0gamF2YXgueG1sLnRyYW5zZm9ybTsgXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tOyBcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zYXg7IFwKLSBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbTsgXAotIGphdmF4LnhtbC52YWxpZGF0aW9uOyBcCi0gamF2YXgueG1sLnhwYXRoOyBcCi0gb3JnLmlldGYuamdzczsgXAotIG9yZy5vbWcuQ09SQkE7IFwKLSBvcmcub21nLkNPUkJBXzJfMzsgXAotIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlOyBcCi0gb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlOyBcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlOyBcCi0gb3JnLm9tZy5DT1JCQS5wb3J0YWJsZTsgXAotIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlOyBcCi0gb3JnLm9tZy5Db3NOYW1pbmc7IFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0UGFja2FnZTsgXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlOyBcCi0gb3JnLm9tZy5EeW5hbWljOyBcCi0gb3JnLm9tZy5EeW5hbWljQW55OyBcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueUZhY3RvcnlQYWNrYWdlOyBcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2U7IFwKLSBvcmcub21nLklPUDsgXAotIG9yZy5vbWcuSU9QLkNvZGVjRmFjdG9yeVBhY2thZ2U7IFwKLSBvcmcub21nLklPUC5Db2RlY1BhY2thZ2U7IFwKLSBvcmcub21nLk1lc3NhZ2luZzsgXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvcjsgXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2U7IFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyOyBcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5DdXJyZW50UGFja2FnZTsgXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2U7IFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQVBhY2thZ2U7IFwKLSBvcmcub21nLlBvcnRhYmxlU2VydmVyLnBvcnRhYmxlOyBcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2U7IFwKLSBvcmcub21nLlNlbmRpbmdDb250ZXh0OyBcCi0gb3JnLm9tZy5zdHViLmphdmEucm1pOyBcCi0gb3JnLm9tZy5zdHViLmphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLnJtaTsgXAotIG9yZy53M2MuZG9tOyBcCi0gb3JnLnczYy5kb20uYm9vdHN0cmFwOyBcCi0gb3JnLnczYy5kb20uY3NzOyBcCi0gb3JnLnczYy5kb20uZXZlbnRzOyBcCi0gb3JnLnczYy5kb20uaHRtbDsgXAotIG9yZy53M2MuZG9tLmxzOyBcCi0gb3JnLnczYy5kb20ucmFuZ2VzOyBcCi0gb3JnLnczYy5kb20uc3R5bGVzaGVldHM7IFwKLSBvcmcudzNjLmRvbS50cmF2ZXJzYWw7IFwKLSBvcmcudzNjLmRvbS52aWV3czsgXAotIG9yZy54bWwuc2F4OyBcCi0gb3JnLnhtbC5zYXguZXh0OyBcCi0gb3JnLnhtbC5zYXguaGVscGVyczsgXAotIHN1bi5taXNjOyBcCi0gc3VuLnJlZmxlY3QKLSAKLW9zZ2k9IFwKLSBvcmcub3NnaS5mcmFtZXdvcms7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L3Rvb2xpbmcvZmVhdHVyZXMvR2VuZXJhdGVGZWF0dXJlc0ZpbGVNb2pvVGVzdC5qYXZhIGIvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L3Rvb2xpbmcvZmVhdHVyZXMvR2VuZXJhdGVGZWF0dXJlc0ZpbGVNb2pvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzMxYjNlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC90b29saW5nL2ZlYXR1cmVzL0dlbmVyYXRlRmVhdHVyZXNGaWxlTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5tZXRhZGF0YS5BcnRpZmFjdE1ldGFkYXRhUmV0cmlldmFsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5BcnRpZmFjdFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLkRlZmF1bHRBcnRpZmFjdFZlcnNpb247Ci1pbXBvcnQgb3JnLmptb2NrLkV4cGVjdGF0aW9uczsKLWltcG9ydCBvcmcuam1vY2suTW9ja2VyeTsKLQotLyoqCi0gKiBUZXN0IGNhc2VzIGZvciB7QGxpbmsgR2VuZXJhdGVGZWF0dXJlc0ZpbGVNb2pvfSAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRmVhdHVyZXNGaWxlTW9qb1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBNb2NrZXJ5IG1vY2tlcnk7Ci0gICAgcHJpdmF0ZSBHZW5lcmF0ZUZlYXR1cmVzRmlsZU1vam8gbW9qbzsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtb2pvID0gbmV3IEdlbmVyYXRlRmVhdHVyZXNGaWxlTW9qbygpOwotICAgICAgICBtb2NrZXJ5ID0gbmV3IE1vY2tlcnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEJlc3RWZXJzaW9uRm9yQXJ0aWZhY3RXaXRoT25lVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geyAgICAgICAKLSAgICAgICAgZmluYWwgQXJ0aWZhY3QgYXJ0aWZhY3QgPSBtb2NrZXJ5Lm1vY2soQXJ0aWZhY3QuY2xhc3MpOwotICAgICAgICBtb2NrZXJ5LmNoZWNraW5nKG5ldyBFeHBlY3RhdGlvbnMoKSB7ewotICAgICAgICAgICAgYWxsb3dpbmcoYXJ0aWZhY3QpLmdldFZlcnNpb24oKTsgd2lsbChyZXR1cm5WYWx1ZSgiMi4xLjYiKSk7Ci0gICAgICAgIH19KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjIuMS42XzEtU05BUFNIT1QiLCBtb2pvLmdldEJlc3RWZXJzaW9uRm9yQXJ0aWZhY3QoYXJ0aWZhY3QsIGNyZWF0ZVZlcnNpb25MaXN0KCIyLjEuNl8xLVNOQVBTSE9UIikpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEJlc3RWZXJzaW9uRm9yQXJ0aWZhY3RXaXRoVHdvVmVyc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAgCi0gICAgICAgIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0ID0gbW9ja2VyeS5tb2NrKEFydGlmYWN0LmNsYXNzKTsKLSAgICAgICAgbW9ja2VyeS5jaGVja2luZyhuZXcgRXhwZWN0YXRpb25zKCkge3sKLSAgICAgICAgICAgIGFsbG93aW5nKGFydGlmYWN0KS5nZXRWZXJzaW9uKCk7IHdpbGwocmV0dXJuVmFsdWUoIjIuMS42IikpOwotICAgICAgICB9fSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyLjEuNl8yLVNOQVBTSE9UIiwgbW9qby5nZXRCZXN0VmVyc2lvbkZvckFydGlmYWN0KGFydGlmYWN0LCBjcmVhdGVWZXJzaW9uTGlzdCgiMi4xLjZfMS1TTkFQU0hPVCIsICIyLjEuNl8yLVNOQVBTSE9UIikpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEJlc3RWZXJzaW9uRm9yQXJ0aWZhY3RXaXRoU2FtZU1ham9yTWlub3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAgCi0gICAgICAgIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0ID0gbW9ja2VyeS5tb2NrKEFydGlmYWN0LmNsYXNzKTsKLSAgICAgICAgbW9ja2VyeS5jaGVja2luZyhuZXcgRXhwZWN0YXRpb25zKCkge3sKLSAgICAgICAgICAgIGFsbG93aW5nKGFydGlmYWN0KS5nZXRWZXJzaW9uKCk7IHdpbGwocmV0dXJuVmFsdWUoIjMuOC4yIikpOwotICAgICAgICB9fSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIzLjguMV8xLVNOQVBTSE9UIiwgbW9qby5nZXRCZXN0VmVyc2lvbkZvckFydGlmYWN0KGFydGlmYWN0LCBjcmVhdGVWZXJzaW9uTGlzdCgiMy44LjFfMS1TTkFQU0hPVCIpKSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEJlc3RWZXJzaW9uRm9yQXJ0aWZhY3RXaXRoT25lTm9uTWF0Y2hpbmdWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0ID0gbW9ja2VyeS5tb2NrKEFydGlmYWN0LmNsYXNzKTsKLSAgICAgICAgbW9ja2VyeS5jaGVja2luZyhuZXcgRXhwZWN0YXRpb25zKCkge3sKLSAgICAgICAgICAgIGFsbG93aW5nKGFydGlmYWN0KS5nZXRWZXJzaW9uKCk7IHdpbGwocmV0dXJuVmFsdWUoIjkuMS4wLjEiKSk7Ci0gICAgICAgIH19KTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtb2pvLmdldEJlc3RWZXJzaW9uRm9yQXJ0aWZhY3QoYXJ0aWZhY3QsIGNyZWF0ZVZlcnNpb25MaXN0KCI5LjBfMS1TTkFQU0hPVCIpKTsKLSAgICAgICAgICAgIGZhaWwoIkFydGlmYWN0TWV0YWRhdGFSZXRyaWV2YWxFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gaWYgbm8gbWF0Y2hpbmcgdmVyc2lvbiB3YXMgZm91bmQiKTsKLSAgICAgICAgfSBjYXRjaCAoQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEJlc3RWZXJzaW9uRm9yQXJ0aWZhY3RXaXRoTm9WZXJzaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9qby5nZXRCZXN0VmVyc2lvbkZvckFydGlmYWN0KG1vY2tlcnkubW9jayhBcnRpZmFjdC5jbGFzcyksIGNyZWF0ZVZlcnNpb25MaXN0KCkpOwotICAgICAgICAgICAgZmFpbCgiQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBpZiBubyBtYXRjaGluZyB2ZXJzaW9uIHdhcyBmb3VuZCIpOwotICAgICAgICB9IGNhdGNoIChBcnRpZmFjdE1ldGFkYXRhUmV0cmlldmFsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgZXhwZWN0ZWQKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3Q8QXJ0aWZhY3RWZXJzaW9uPiBjcmVhdGVWZXJzaW9uTGlzdChTdHJpbmcuLi4gdmVyc2lvbnMpIHsKLSAgICAgICAgTGlzdDxBcnRpZmFjdFZlcnNpb24+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0VmVyc2lvbj4oKTsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmVyc2lvbiA6IHZlcnNpb25zKSB7Ci0gICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgRGVmYXVsdEFydGlmYWN0VmVyc2lvbih2ZXJzaW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L3Rvb2xpbmcvZmVhdHVyZXMvR2VuZXJhdGVGZWF0dXJlc1htbE1vam9UZXN0LmphdmEgYi9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9HZW5lcmF0ZUZlYXR1cmVzWG1sTW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZWU3ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvdG9vbGluZy9mZWF0dXJlcy9HZW5lcmF0ZUZlYXR1cmVzWG1sTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZy5mZWF0dXJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmptb2NrLkV4cGVjdGF0aW9uczsKLWltcG9ydCBvcmcuam1vY2suTW9ja2VyeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IGNhc2VzIGZvciB7QGxpbmsgR2VuZXJhdGVGZWF0dXJlc1htbE1vam99Ci0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUZlYXR1cmVzWG1sTW9qb1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBNb2NrZXJ5IG1vY2tlcnk7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbW9ja2VyeSA9IG5ldyBNb2NrZXJ5KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBBcnRpZmFjdCBhcnRpZmFjdCA9IG1vY2tlcnkubW9jayhBcnRpZmFjdC5jbGFzcyk7Ci0gICAgICAgIG1vY2tlcnkuY2hlY2tpbmcobmV3IEV4cGVjdGF0aW9ucygpIHt7Ci0gICAgICAgICAgICBhbGxvd2luZyhhcnRpZmFjdCkuZ2V0R3JvdXBJZCgpOyB3aWxsKHJldHVyblZhbHVlKCJvcmcuYXBhY2hlLnNlcnZpY2VtaXgudGVzdCIpKTsKLSAgICAgICAgICAgIGFsbG93aW5nKGFydGlmYWN0KS5nZXRBcnRpZmFjdElkKCk7IHdpbGwocmV0dXJuVmFsdWUoInRlc3QtYXJ0aWZhY3QiKSk7Ci0gICAgICAgICAgICBhbGxvd2luZyhhcnRpZmFjdCkuZ2V0VmVyc2lvbigpOyB3aWxsKHJldHVyblZhbHVlKCIxLjIuMyIpKTsKLSAgICAgICAgfX0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuc2VydmljZW1peC50ZXN0L3Rlc3QtYXJ0aWZhY3QvMS4yLjMiLCBHZW5lcmF0ZUZlYXR1cmVzWG1sTW9qby50b1N0cmluZyhhcnRpZmFjdCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi8uZ2l0aWdub3JlIGIvamJpLW1hdmVuLXBsdWdpbi8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWY2NmQyLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotdGFyZ2V0Ci0ucHJvamVjdAotLmNsYXNzcGF0aAotLnNldHRpbmdzCi0qLmk/PwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vTElDRU5TRSBiL2piaS1tYXZlbi1wbHVnaW4vTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9OT1RJQ0UgYi9qYmktbWF2ZW4tcGx1Z2luL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyMTJjNC4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgPT0gIE5PVElDRSBmaWxlIGZvciB1c2Ugd2l0aCB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICA9PQotICAgPT0gIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBTZXJ2aWNlTWl4IGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICA9PQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBUaGlzIHByb2R1Y3QgY29udGFpbnMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gICBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiL2piaS1tYXZlbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxYTM5Yy4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPCEtLQotCi0gICAgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgICAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICAgICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgICAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAgICAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAgLS0+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZzwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2lucy1wb208L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjQ8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vbWF2ZW4tcGx1Z2lucy1wb20vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+amJpLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjYtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBTZXJ2aWNlTWl4IDo6IFBsdWdpbnMgOjogTWF2ZW4yIEpCSSBQbHVnaW48L25hbWU+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvc2VydmljZW1peC9tYXZlbi1wbHVnaW5zL2piaS1tYXZlbi1wbHVnaW4vdHJ1bms8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvc2VydmljZW1peC9tYXZlbi1wbHVnaW5zL2piaS1tYXZlbi1wbHVnaW4vdHJ1bmsKLSAgICAgICAgPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9zZXJ2aWNlbWl4L21hdmVuLXBsdWdpbnMvamJpLW1hdmVuLXBsdWdpbi90cnVuazwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxzZXJ2aWNlbWl4LnNwZWNzLnZlcnNpb24+MS44LjA8L3NlcnZpY2VtaXguc3BlY3MudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8IS0tIGxpdHRsZSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGlzIGdldHMgZG93bmxvYWRlZCBiZWZvcmUgbWF2ZW4tcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQgZ2V0cyBwdWxsZWQgaW4gLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmljZW1peC1wb208L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC45PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoaXZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4xPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb250YWluZXItZGVmYXVsdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS4yPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNjcmlwdC1hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmljZW1peC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+My40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmljZW1peC1jb21tb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yMDExLjAxPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS42LjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS42LjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1lamJfMi4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tanRhXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tajJlZS1jb25uZWN0b3JfMS41X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctdHg8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4zLjAuNS5SRUxFQVNFPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLW1vZGVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjk8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPndzZGw0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndzZGw0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNi4yPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNlcnZpY2VtaXguc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnNwZWNzLmpiaS1hcGktMS4wPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmljZW1peC5zcGVjcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwhLS0gbGl0dGxlIGhhY2sgdG8gYXZvaWQgdG91Y2hpbmcgamVuY2tzIDIuMSAocmVmZXJzIHRvIHNlcnZpY2VtaXgub3JnKSAtLT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5qZW5ja3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVuY2tzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gV2Ugd2FudCB0byBkZXBsb3kgdGhlIGFydGlmYWN0IHRvIGEgc3RhZ2luZyBsb2NhdGlvbiBmb3IgcGVydXNhbCAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbHREZXBsb3ltZW50UmVwb3NpdG9yeT4ke2RlcGxveS5hbHRSZXBvc2l0b3J5fTwvYWx0RGVwbG95bWVudFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVwZGF0ZVJlbGVhc2VJbmZvPnRydWU8L3VwZGF0ZVJlbGVhc2VJbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSB3YW50IHRvIHNpZ24gdGhlIGFydGlmYWN0LCB0aGUgUE9NLCBhbmQgYWxsIGF0dGFjaGVkIGFydGlmYWN0cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXNzcGhyYXNlPiR7Z3BnLnBhc3NwaHJhc2V9PC9wYXNzcGhyYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5kZXBsb3k8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxkZWZhdWx0R29hbD5kZXBsb3k8L2RlZmF1bHRHb2FsPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRhY2g+dHJ1ZTwvYXR0YWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRhY2g+dHJ1ZTwvYXR0YWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwhLS0gQWRkIHRoZSBBbnQgcGx1Z2luIHRvb2xzIC0tPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tdG9vbHMtYW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxnb2FsUHJlZml4PmpiaTwvZ29hbFByZWZpeD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9BYnN0cmFjdERlcGxveWFibGVNb2pvLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvQWJzdHJhY3REZXBsb3lhYmxlTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU5YjcwLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9BYnN0cmFjdERlcGxveWFibGVNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suSmJpVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZXBsb3lhYmxlTW9qbyBleHRlbmRzIEFic3RyYWN0SmJpTW9qbyB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InJtaSIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlclByb3RvY29sOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJsb2NhbGhvc3QiIGV4cHJlc3Npb249IiR7aG9zdH0iCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBob3N0OwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJTZXJ2aWNlTWl4IiBleHByZXNzaW9uPSIke2NvbnRhaW5lck5hbWV9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb250YWluZXJOYW1lOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJvcmcuYXBhY2hlLnNlcnZpY2VtaXgiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBqbXhEb21haW5OYW1lOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIxMDk5IiBleHByZXNzaW9uPSIke3BvcnR9IgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcG9ydDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iL2pteHJtaSIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGpuZGlQYXRoOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJzbXgiIGV4cHJlc3Npb249IiR7dXNlcm5hbWV9IgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlcm5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InNteCIgZXhwcmVzc2lvbj0iJHtwYXNzd29yZH0iCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtzZXJ2aWNlVXJsfQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZVVybDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ke2Vudmlyb25tZW50fQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZW52aXJvbm1lbnQ7Ci0KLSAgICBwcm90ZWN0ZWQgSmJpVGFzayBpbml0aWFsaXplSmJpVGFzayhKYmlUYXNrIHRhc2spIHsKLQotICAgICAgICBQcm9qZWN0IGFudFByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBhbnRQcm9qZWN0LmluaXQoKTsKLSAgICAgICAgdGFzay5zZXRQcm9qZWN0KGFudFByb2plY3QpOwotCi0gICAgICAgIHRhc2suc2V0Q29udGFpbmVyTmFtZShjb250YWluZXJOYW1lKTsKLSAgICAgICAgdGFzay5zZXRIb3N0KGhvc3QpOwotICAgICAgICB0YXNrLnNldFNlcnZlclByb3RvY29sKHNlcnZlclByb3RvY29sKTsKLSAgICAgICAgdGFzay5zZXRKbXhEb21haW5OYW1lKGpteERvbWFpbk5hbWUpOwotICAgICAgICB0YXNrLnNldFBvcnQoSW50ZWdlci5wYXJzZUludChwb3J0KSk7Ci0gICAgICAgIHRhc2suc2V0Sm5kaVBhdGgoam5kaVBhdGgpOwotICAgICAgICB0YXNrLnNldFVzZXJuYW1lKHVzZXJuYW1lKTsKLSAgICAgICAgdGFzay5zZXRQYXNzd29yZChwYXNzd29yZCk7Ci0gICAgICAgIHRhc2suc2V0U2VydmljZVVybChzZXJ2aWNlVXJsKTsKLSAgICAgICAgdGFzay5zZXRFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7Ci0KLSAgICAgICAgdGFzay5zZXRUYXNrTmFtZSgiSkJJVGFzayIpOwotICAgICAgICB0YXNrLnNldFRhc2tUeXBlKCJKQklUYXNrIik7Ci0gICAgICAgIHJldHVybiB0YXNrOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0Fic3RyYWN0RGVzY3JpcHRvcldyaXRlci5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0Fic3RyYWN0RGVzY3JpcHRvcldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA1ODVjLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9BYnN0cmFjdERlc2NyaXB0b3JXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmNvbW1vbi5wYWNrYWdpbmcuQ29uc3VtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5jb21tb24ucGFja2FnaW5nLlByb3ZpZGVzOw0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhNTFdyaXRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3REZXNjcmlwdG9yV3JpdGVyIHsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU3RyaW5nQXR0cmlidXRlKFhNTFdyaXRlciB3cml0ZXIsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLA0KLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgew0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZXIuYWRkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRRTmFtZUF0dHJpYnV0ZShYTUxXcml0ZXIgd3JpdGVyLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwNCi0gICAgICAgICAgICBRTmFtZSBhdHRyaWJ1dGVWYWx1ZSwgTWFwIG5hbWVzcGFjZU1hcCkgew0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYXR0cmlidXRlU3RyaW5nVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotICAgICAgICAgICAgYXR0cmlidXRlU3RyaW5nVmFsdWUuYXBwZW5kKG5hbWVzcGFjZU1hcC5nZXQoYXR0cmlidXRlVmFsdWUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXROYW1lc3BhY2VVUkkoKSkpOw0KLSAgICAgICAgICAgIGF0dHJpYnV0ZVN0cmluZ1ZhbHVlLmFwcGVuZCgiOiIpOw0KLSAgICAgICAgICAgIGF0dHJpYnV0ZVN0cmluZ1ZhbHVlLmFwcGVuZChhdHRyaWJ1dGVWYWx1ZS5nZXRMb2NhbFBhcnQoKSk7DQotICAgICAgICAgICAgd3JpdGVyLmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVTdHJpbmdWYWx1ZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldE5hbWVzcGFjZU1hcChMaXN0IHByb3ZpZGVzLCBMaXN0IGNvbnN1bWVzKSB7DQotICAgICAgICBNYXAgbmFtZXNwYWNlTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgIGludCBuYW1lc3BhY2VDb3VudGVyID0gMTsNCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm92aWRlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgUHJvdmlkZXMgcHJvdmlkZXNFbnRyeSA9IChQcm92aWRlcykgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIG5hbWVzcGFjZUNvdW50ZXIgPSByZXNvbHZlTWFwRW50cnkobmFtZXNwYWNlTWFwLCBwcm92aWRlc0VudHJ5DQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlTmFtZSgpLCBuYW1lc3BhY2VDb3VudGVyKTsNCi0gICAgICAgICAgICBuYW1lc3BhY2VDb3VudGVyID0gcmVzb2x2ZU1hcEVudHJ5KG5hbWVzcGFjZU1hcCwgcHJvdmlkZXNFbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFNlcnZpY2VOYW1lKCksIG5hbWVzcGFjZUNvdW50ZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnN1bWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICBDb25zdW1lcyBjb25zdW1lc0VudHJ5ID0gKENvbnN1bWVzKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgbmFtZXNwYWNlQ291bnRlciA9IHJlc29sdmVNYXBFbnRyeShuYW1lc3BhY2VNYXAsIGNvbnN1bWVzRW50cnkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRJbnRlcmZhY2VOYW1lKCksIG5hbWVzcGFjZUNvdW50ZXIpOw0KLSAgICAgICAgICAgIG5hbWVzcGFjZUNvdW50ZXIgPSByZXNvbHZlTWFwRW50cnkobmFtZXNwYWNlTWFwLCBjb25zdW1lc0VudHJ5DQotICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZU5hbWUoKSwgbmFtZXNwYWNlQ291bnRlcik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmFtZXNwYWNlTWFwOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IHJlc29sdmVNYXBFbnRyeShNYXAgbmFtZXNwYWNlTWFwLCBRTmFtZSBxbmFtZSwNCi0gICAgICAgICAgICBpbnQgbmFtZXNwYWNlQ291bnRlcikgew0KLSAgICAgICAgaWYgKChxbmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAmJiAoIW5hbWVzcGFjZU1hcC5jb250YWluc0tleShxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpKSB7DQotICAgICAgICAgICAgaWYgKHFuYW1lLmdldFByZWZpeCgpID09IG51bGwgfHwgcW5hbWUuZ2V0UHJlZml4KCkuZXF1YWxzKCIiKSkgew0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYXAucHV0KHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCAibnMiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lc3BhY2VDb3VudGVyKyspOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hcC5wdXQocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldFByZWZpeCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmFtZXNwYWNlQ291bnRlcjsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvQWJzdHJhY3RKYmlNb2pvLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvQWJzdHJhY3RKYmlNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTUyNTEuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0Fic3RyYWN0SmJpTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5mYWN0b3J5LkFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLkFydGlmYWN0TWV0YWRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0Q29sbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5BcnRpZmFjdEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuSW52YWxpZFZlcnNpb25TcGVjaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5EZXBlbmRlbmN5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuRGVwZW5kZW5jeU1hbmFnZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5QbHVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5Qcm9qZWN0QnVpbGRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmkuSmJpUmVzb2x1dGlvbkxpc3RlbmVyLk5vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuTWFuaWZlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYmlNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpCSV9ERVNDUklQVE9SID0gImpiaS54bWwiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCX0RJUkVDVE9SWSA9ICJsaWIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBWRVJTSU9OX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl4oXFxkKyhcXC5cXGQrKFxcLlxcZCspPyk/KS0iKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZFUlNJT05fQ09NUExFVEVSUyA9IG5ldyBTdHJpbmdbXSB7Ii4wLjAiLCAiLjAiIH07Ci0KLSAgICAvKioKLSAgICAgKiBNYXZlbiBQcm9qZWN0SGVscGVyCi0gICAgICogCi0gICAgICogQGNvbXBvbmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXZlblByb2plY3RIZWxwZXIgcHJvamVjdEhlbHBlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXZlbiBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RvcnkgdGhhdCByZXNvdXJjZXMgYXJlIGNvcGllZCB0byBkdXJpbmcgdGhlIGJ1aWxkLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS1pbnN0YWxsZXIiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgd29ya0RpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0QnVpbGRlciBwcm9qZWN0QnVpbGRlcjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtsb2NhbFJlcG9zaXRvcnl9IgotICAgICAqLwotICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QucmVtb3RlQXJ0aWZhY3RSZXBvc2l0b3JpZXN9IgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IHJlbW90ZVJlcG9zOwotCi0gICAgLyoqCi0gICAgICogQGNvbXBvbmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBBcnRpZmFjdE1ldGFkYXRhU291cmNlIGFydGlmYWN0TWV0YWRhdGFTb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiBAY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0UmVzb2x2ZXIgcmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAY29tcG9uZW50Ci0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0Q29sbGVjdG9yIGNvbGxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGaWxlIGdldFdvcmtEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiB3b3JrRGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBNYXZlblByb2plY3RIZWxwZXIgZ2V0UHJvamVjdEhlbHBlcigpIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3RIZWxwZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQnJhbmNoKEpiaVJlc29sdXRpb25MaXN0ZW5lciBsaXN0ZW5lciwgQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgTm9kZSBuID0gbGlzdGVuZXIuZ2V0Tm9kZShhcnRpZmFjdCk7Ci0gICAgICAgIGlmIChuICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTm9kZSBwYXJlbnQgOiBuLmdldFBhcmVudHMoKSkgewotICAgICAgICAgICAgICAgIHBhcmVudC5nZXRDaGlsZHJlbigpLnJlbW92ZShuKTsKLSAgICAgICAgICAgIH0KLQkJfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkcmVuKEpiaVJlc29sdXRpb25MaXN0ZW5lciBsaXN0ZW5lciwgQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgTm9kZSBuID0gbGlzdGVuZXIuZ2V0Tm9kZShhcnRpZmFjdCk7Ci0gICAgICAgIG4uZ2V0Q2hpbGRyZW4oKS5jbGVhcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXQ8QXJ0aWZhY3Q+IGdldEFydGlmYWN0cyhOb2RlIG4sIFNldDxBcnRpZmFjdD4gcykgewotICAgICAgICBpZiAocy5hZGQobi5nZXRBcnRpZmFjdCgpKSkgewotICAgICAgICAgICAgZm9yIChOb2RlIGMgOiBuLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRBcnRpZmFjdHMoYywgcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhjbHVkZUJyYW5jaChOb2RlIG4sIFNldDxBcnRpZmFjdD4gZXhjbHVkZXMpIHsKLSAgICAgICAgZXhjbHVkZXMuYWRkKG4uZ2V0QXJ0aWZhY3QoKSk7Ci0gICAgICAgIGZvciAoTm9kZSBjIDogbi5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBleGNsdWRlQnJhbmNoKGMsIGV4Y2x1ZGVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50KE5vZGUgcm9vdE5vZGUpIHsKLSAgICAgICAgZm9yIChBcnRpZmFjdCBhIDogZ2V0QXJ0aWZhY3RzKHJvb3ROb2RlLCBuZXcgSGFzaFNldDxBcnRpZmFjdD4oKSkpIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIiAiICsgYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChOb2RlIHJvb3ROb2RlLCBTdHJpbmcgcGZ4KSB7Ci0gICAgICAgIGdldExvZygpLmluZm8ocGZ4ICsgcm9vdE5vZGUuZ2V0QXJ0aWZhY3QoKSk7Ci0gICAgICAgIGZvciAoTm9kZSBjaGlsZCA6IHJvb3ROb2RlLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIHByaW50KGNoaWxkLCAiICIgKyBwZngpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJ1bmVUcmVlKE5vZGUgbm9kZSwgU2V0PEFydGlmYWN0PiBleGNsdWRlcykgewotICAgICAgICBmb3IgKEl0ZXJhdG9yPE5vZGU+IGl0ZXIgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0QXJ0aWZhY3QoKS5pc09wdGlvbmFsKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCFjaGlsZC5nZXRTY29wZSgpLmVxdWFscyhBcnRpZmFjdC5TQ09QRV9DT01QSUxFKSAmJiAhY2hpbGQuZ2V0U2NvcGUoKS5lcXVhbHMoQXJ0aWZhY3QuU0NPUEVfUlVOVElNRSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzLmNvbnRhaW5zKGNoaWxkLmdldEFydGlmYWN0KCkpKSB7Ci0gICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJ1bmVUcmVlKGNoaWxkLCBleGNsdWRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PEFydGlmYWN0PiByZXRhaW5BcnRpZmFjdHMoU2V0PEFydGlmYWN0PiBpbmNsdWRlcywgSmJpUmVzb2x1dGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIFNldDxBcnRpZmFjdD4gZmluYWxJbmNsdWRlcyA9IG5ldyBIYXNoU2V0PEFydGlmYWN0PigpOwotICAgICAgICBTZXQ8QXJ0aWZhY3Q+IGZpbHRlcmVkQXJ0aWZhY3RzID0gZ2V0QXJ0aWZhY3RzKGxpc3RlbmVyLmdldFJvb3ROb2RlKCksIG5ldyBIYXNoU2V0PEFydGlmYWN0PigpKTsKLSAgICAgICAgZm9yIChBcnRpZmFjdCBhcnRpZmFjdCA6IGluY2x1ZGVzKSB7Ci0gICAgICAgICAgICBmb3IgKEFydGlmYWN0IGZpbHRlcmVkQXJ0aWZhY3QgOiBmaWx0ZXJlZEFydGlmYWN0cykgewotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZEFydGlmYWN0LmdldEFydGlmYWN0SWQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWx0ZXJlZEFydGlmYWN0LmdldFR5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGFydGlmYWN0LmdldFR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbHRlcmVkQXJ0aWZhY3QuZ2V0R3JvdXBJZCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcmVkQXJ0aWZhY3QuZ2V0VmVyc2lvbigpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdC5nZXRWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzb2x2ZWQgYXJ0aWZhY3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcnRpZmFjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uIGZyb20gdGhhdCBpbiBkZXBlbmRlbmN5IG1hbmFnZW1lbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXJlZEFydGlmYWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG92ZXJyaWRpbmcgZGVwZW5kZW5jeSBtYW5hZ2VtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxJbmNsdWRlcy5hZGQoYXJ0aWZhY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaW5hbEluY2x1ZGVzOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIEpiaVJlc29sdXRpb25MaXN0ZW5lciByZXNvbHZlUHJvamVjdCgpIHsKLSAgICAgICAgTWFwIG1hbmFnZWRWZXJzaW9ucyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYW5hZ2VkVmVyc2lvbnMgPSBjcmVhdGVNYW5hZ2VkVmVyc2lvbk1hcChwcm9qZWN0LmdldElkKCksIHByb2plY3QuZ2V0RGVwZW5kZW5jeU1hbmFnZW1lbnQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVzb2x2aW5nIHByb2plY3QgZGVwZW5kZW5jaWVzLiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIEpiaVJlc29sdXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBKYmlSZXNvbHV0aW9uTGlzdGVuZXIoKTsKLSAgICAgICAgbGlzdGVuZXIuc2V0TG9nKGdldExvZygpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbGxlY3Rvci5jb2xsZWN0KHByb2plY3QuZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpLCBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBcnRpZmFjdCgpLCBtYW5hZ2VkVmVyc2lvbnMsIGxvY2FsUmVwbywgcmVtb3RlUmVwb3MsCi0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0TWV0YWRhdGFTb3VyY2UsIG51bGwsIENvbGxlY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpbmdsZXRvbkxpc3QobGlzdGVuZXIpKTsKLSAgICAgICAgfSBjYXRjaCAoQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZygpLmVycm9yKAotICAgICAgICAgICAgICAgICAgICAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVzb2x2aW5nIHByb2plY3QgZGVwZW5kZW5jaWVzLiIsCi0gICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRMb2coKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiRGVwZW5kZW5jeSBncmFwaCIpOwotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIj09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIHByaW50KGxpc3RlbmVyLmdldFJvb3ROb2RlKCkpOwotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIj09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBjcmVhdGVNYW5hZ2VkVmVyc2lvbk1hcChTdHJpbmcgcHJvamVjdElkLAotICAgICAgICAgICAgRGVwZW5kZW5jeU1hbmFnZW1lbnQgZGVwZW5kZW5jeU1hbmFnZW1lbnQpIHRocm93cyBQcm9qZWN0QnVpbGRpbmdFeGNlcHRpb24gewotICAgICAgICBNYXAgbWFwOwotICAgICAgICBpZiAoZGVwZW5kZW5jeU1hbmFnZW1lbnQgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGRlcGVuZGVuY3lNYW5hZ2VtZW50LmdldERlcGVuZGVuY2llcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZXBlbmRlbmN5TWFuYWdlbWVudC5nZXREZXBlbmRlbmNpZXMoKS5pdGVyYXRvcigpOyBpCi0gICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgRGVwZW5kZW5jeSBkID0gKERlcGVuZGVuY3kpIGkubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZSA9IFZlcnNpb25SYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVGcm9tVmVyc2lvblNwZWMoZC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IGZhY3RvcnkuY3JlYXRlRGVwZW5kZW5jeUFydGlmYWN0KGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0R3JvdXBJZCgpLCBkLmdldEFydGlmYWN0SWQoKSwgdmVyc2lvblJhbmdlLCBkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFR5cGUoKSwgZC5nZXRDbGFzc2lmaWVyKCksIGQuZ2V0U2NvcGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoZC5nZXRNYW5hZ2VtZW50S2V5KCksIGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkVmVyc2lvblNwZWNpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uKHByb2plY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIHZlcnNpb24gJyIgKyBkLmdldFZlcnNpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBmb3IgZGVwZW5kZW5jeSAnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkLmdldE1hbmFnZW1lbnRLZXkoKSArICInOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdXAgYSBjbGFzc2xvYWRlciBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVSTENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2V0IHVybHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgICAgICBVUkwgbWFpbkNsYXNzZXMgPSBuZXcgRmlsZShwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0T3V0cHV0RGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgICAgIC50b1VSTCgpOwotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkFkZGluZyB0byBjbGFzc3BhdGggOiAiICsgbWFpbkNsYXNzZXMpOwotICAgICAgICAgICAgdXJscy5hZGQobWFpbkNsYXNzZXMpOwotCi0gICAgICAgICAgICBVUkwgdGVzdENsYXNzZXMgPSBuZXcgRmlsZShwcm9qZWN0LmdldEJ1aWxkKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFRlc3RPdXRwdXREaXJlY3RvcnkoKSkudG9VUkwoKTsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJBZGRpbmcgdG8gY2xhc3NwYXRoIDogIiArIHRlc3RDbGFzc2VzKTsKLSAgICAgICAgICAgIHVybHMuYWRkKHRlc3RDbGFzc2VzKTsKLQotICAgICAgICAgICAgU2V0IGRlcGVuZGVuY2llcyA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBcnRpZmFjdCBjbGFzc1BhdGhFbGVtZW50ID0gKEFydGlmYWN0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJBZGRpbmcgYXJ0aWZhY3Q6ICIgKyBjbGFzc1BhdGhFbGVtZW50LmdldEZpbGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdG8gY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICAgICAgdXJscy5hZGQoY2xhc3NQYXRoRWxlbWVudC5nZXRGaWxlKCkudG9VUkwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVUkxDbGFzc0xvYWRlciBhcHBDbGFzc2xvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcigoVVJMW10pIHVybHMKLSAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gYXBwQ2xhc3Nsb2FkZXI7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIGR1cmluZyBzZXR0aW5nIHVwIGNsYXNzcGF0aCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hbmlmZXN0IGNyZWF0ZU1hbmlmZXN0KCkgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKLSAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoKTsKLSAgICAgICAgLy9tYW5pZmVzdC5nZXRNYWluU2VjdGlvbigpLmFkZENvbmZpZ3VyZWRBdHRyaWJ1dGUobmV3IE1hbmlmZXN0LkF0dHJpYnV0ZSgiQnVuZGxlLU5hbWUiLCBwcm9qZWN0LmdldE5hbWUoKSkpOwotICAgICAgICAvL21hbmlmZXN0LmdldE1haW5TZWN0aW9uKCkuYWRkQ29uZmlndXJlZEF0dHJpYnV0ZShuZXcgTWFuaWZlc3QuQXR0cmlidXRlKCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkpKTsKLSAgICAgICAgLy9tYW5pZmVzdC5nZXRNYWluU2VjdGlvbigpLmFkZENvbmZpZ3VyZWRBdHRyaWJ1dGUobmV3IE1hbmlmZXN0LkF0dHJpYnV0ZSgKLSAgICAgICAgICAgIC8vIkJ1bmRsZS1WZXJzaW9uIiwgZml4QnVuZGxlVmVyc2lvbihwcm9qZWN0LmdldFZlcnNpb24oKSkpKTsKLSAgICAgICAgcmV0dXJuIG1hbmlmZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeEJ1bmRsZVZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgLy8gTWF2ZW4gdXNlcyBhICctJyB0byBzZXBhcmF0ZSB0aGUgdmVyc2lvbiBxdWFsaWZpZXIsIHdoaWxlCi0gICAgICAgIC8vIE9TR2kgdXNlcyBhICcuJywgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBmaXJzdCAnLScgdG8gYQotICAgICAgICAvLyAnLicgYW5kIGZpbGwgaW4gYW55IG1pc3NpbmcgbWlub3Igb3IgbWljcm8gdmVyc2lvbgotICAgICAgICAvLyBjb21wb25lbnRzIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gVkVSU0lPTl9QQVRURVJOLm1hdGNoZXIodmVyc2lvbik7Ci0gICAgICAgIGlmICghbWF0Y2hlci5sb29raW5nQXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTGVhdmUgZXh0cmEgc3BhY2UgZm9yIHdvcnN0LWNhc2UgYWRkaXRpb25hbCBpbnNlcnRpb246Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIodmVyc2lvbi5sZW5ndGgoKSArIDQpOwotICAgICAgICBzYi5hcHBlbmQobWF0Y2hlci5ncm91cCgxKSk7Ci0gICAgICAgIGlmIChudWxsID09IG1hdGNoZXIuZ3JvdXAoMykpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG51bGwgIT0gbWF0Y2hlci5ncm91cCgyKSA/IDIgOiAxOwotICAgICAgICAgICAgc2IuYXBwZW5kKFZFUlNJT05fQ09NUExFVEVSU1tjb3VudCAtIDFdKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoJy4nKTsKLSAgICAgICAgc2IuYXBwZW5kKHZlcnNpb24uc3Vic3RyaW5nKG1hdGNoZXIuZW5kKCksIHZlcnNpb24ubGVuZ3RoKCkpKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmljZVVuaXROYW1lKE1hdmVuUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoT2JqZWN0IGVsZW0gOiBwcm9qZWN0LmdldEJ1aWxkUGx1Z2lucygpKSB7Ci0JCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFBsdWdpbikgewotCQkJCVBsdWdpbiBwbHVnaW4gPSAoUGx1Z2luKWVsZW07Ci0JCQkJaWYgKHBsdWdpbi5nZXRHcm91cElkKCkuZXF1YWxzKCJvcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZyIpCi0JCQkJCQkmJiBwbHVnaW4uZ2V0QXJ0aWZhY3RJZCgpLmVxdWFscygiamJpLW1hdmVuLXBsdWdpbiIpKSB7Ci0JCQkJCVhwcDNEb20gY29uZmlndXJhdGlvbiA9IChYcHAzRG9tKSBwbHVnaW4uZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlYcHAzRG9tIHNlcnZpY2VVbml0TmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGQoInNlcnZpY2VVbml0TmFtZSIpOwotCQkJCQkJaWYgKHNlcnZpY2VVbml0TmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIHNlcnZpY2VVbml0TmFtZS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0RlcGVuZGVuY3lJbmZvcm1hdGlvbi5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0RlcGVuZGVuY3lJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRjZjk0Li4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9EZXBlbmRlbmN5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmk7Ci0KLS8qKgotICogVGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgYSBzaW1wbGUgdmFsdWUgb2JqZWN0IHRvIGhlbHAgd2l0aCBwYXNzaW5nCi0gKiBhcm91bmQgaW5mb3JtYXRpb24gb24gZGVwZW5kZW5jaWVzIHVzZWQgdG8gaGVscCBpbiB0aGUgY3JlYXRpb24gb2YgdGhlIGpiaQotICogZGVzY3JpcHRvcnMKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUluZm9ybWF0aW9uIHsKLQotICAgIC8qKgotICAgICAqIEFydGlmYWN0IHR5cGUgZm9yIGEgSkJJIFNoYXJlZCBMaWJyYXJ5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0xJQlJBUllfVFlQRSA9ICJqYmktc2hhcmVkLWxpYnJhcnkiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBhcnRpZmFjdFppcCkgewotICAgICAgICB0aGlzLmZpbGVuYW1lID0gYXJ0aWZhY3RaaXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFN0cmluZyBjb21wb25lbnQpIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzIHRoaXMgZGVwZW5kZW5jeSBhIEpCSSBTaGFyZWQgTGlicmFyeT8KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZExpYnJhcnkoKSB7Ci0gICAgICAgIHJldHVybiBTSEFSRURfTElCUkFSWV9UWVBFLmVxdWFscyh0eXBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qby5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlQ29tcG9uZW50RGVzY3JpcHRvck1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1YjAyMi4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5BcnRpZmFjdEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0LlByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpLkRlcGVuZGVuY3lJbmZvcm1hdGlvbi4qOwotCi0vKioKLSAqIEEgTW9qbyB1c2VkIHRvIGJ1aWxkIHRoZSBqYmkueG1sIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0iZ25vZGV0QGFwYWNoZS5vcmciPkd1aWxsYXVtZSBOb2RldDwvYT4KLSAqIEB2ZXJzaW9uICRJZDogR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qbyAzMTQ5NTYgMjAwNS0xMC0xMiAxNjoyNzoxNVoKLSAqICAgICAgICAgIGJyZXR0ICQKLSAqIEBnb2FsIGdlbmVyYXRlLWpiaS1jb21wb25lbnQtZGVzY3JpcHRvcgotICogQHBoYXNlIGdlbmVyYXRlLXJlc291cmNlcwotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICogQGRlc2NyaXB0aW9uIGdlbmVyYXRlcyB0aGUgamJpLnhtbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlQ29tcG9uZW50RGVzY3JpcHRvck1vam8gZXh0ZW5kcyBBYnN0cmFjdEpiaU1vam8gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgYXBwbGljYXRpb24ueG1sIHNob3VsZCBiZSBnZW5lcmF0ZWQgb3Igbm90LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEJvb2xlYW4gZ2VuZXJhdGVKYmlEZXNjcmlwdG9yID0gQm9vbGVhbi5UUlVFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYm9vdHN0cmFwIGNsYXNzIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGJvb3RzdHJhcDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb21wb25lbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb21wb25lbnQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5hcnRpZmFjdElkfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBkZWZhdWx0IGJvb3RzdHJhcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXMvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L2NvbW1vbi9EZWZhdWx0Qm9vdHN0cmFwLmNsYXNzIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBkZWZhdWx0Qm9vdHN0cmFwRmlsZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb21wb25lbnQgZGVzY3JpcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QubmFtZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBhcHBsaWNhdGlvbi54bWwgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBVVEZfODsKLQotICAgIC8qKgotICAgICAqIERpcmVjdG9yeSB3aGVyZSB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGUgd2lsbCBiZSBhdXRvLWdlbmVyYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb21wb25lbnQgY2xhc3MgbG9hZGVyIGRlbGVnYXRpb24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InBhcmVudC1maXJzdCIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnRDbGFzc0xvYWRlckRlbGVnYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlciBkZWxlZ2F0aW9uCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJwYXJlbnQtZmlyc3QiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYm9vdHN0cmFwQ2xhc3NMb2FkZXJEZWxlZ2F0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEEgbGlzdCBvZiBkZXBlbmRlbmN5IHR5cGVzIHRvIGluY2x1ZGUgaW4gY29tcG9uZW50IGNsYXNzcGF0aC4KLSAgICAgKiBEZWZhdWx0OiBqYXIsIGJ1bmRsZSwgamJpLWNvbXBvbmVudAotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBjb21wb25lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117ImphciIsICJidW5kbGUiLCAiamJpLWNvbXBvbmVudCJ9KSk7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLQotICAgICAgICBnZXRMb2coKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiID09PT09PT0gR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qbyBzZXR0aW5ncyA9PT09PT09Iik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJ3b3JrRGlyZWN0b3J5WyIgKyB3b3JrRGlyZWN0b3J5ICsgIl0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoImdlbmVyYXRlSmJpRGVzY3JpcHRvclsiICsgZ2VuZXJhdGVKYmlEZXNjcmlwdG9yICsgIl0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoInR5cGVbIiArIHR5cGUgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiY29tcG9uZW50WyIgKyBjb21wb25lbnQgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiYm9vdHN0cmFwWyIgKyBib290c3RyYXAgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygibmFtZVsiICsgbmFtZSArICJdIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJkZXNjcmlwdGlvblsiICsgZGVzY3JpcHRpb24gKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiZW5jb2RpbmdbIiArIGVuY29kaW5nICsgIl0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgImdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvblsiICsgZ2VuZXJhdGVkRGVzY3JpcHRvckxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0KLSAgICAgICAgaWYgKCFnZW5lcmF0ZUpiaURlc2NyaXB0b3IuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW9uIG9mIGpiaS54bWwgaXMgZGlzYWJsZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChib290c3RyYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0Qm9vdFN0cmFwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZW5lcmF0ZSBqYmkgZGVzY3JpcHRvciBhbmQgY29weSBpdCB0byB0aGUgYnVpbGQgZGlyZWN0b3J5Ci0gICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgamJpLnhtbCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2VuZXJhdGVKYmlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEpiaVBsdWdpbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGdlbmVyYXRlIGpiaS54bWwiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShuZXcgRmlsZShnZW5lcmF0ZWREZXNjcmlwdG9yTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIEpCSV9ERVNDUklQVE9SKSwgbmV3IEZpbGUoZ2V0V29ya0RpcmVjdG9yeSgpLCBNRVRBX0lORikpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjb3B5IGpiaS54bWwgdG8gZmluYWwgZGVzdGluYXRpb24iLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byBpbmplY3QgdGhlIEJhc2VCb290c3RyYXAgZnJvbSBzZXJ2aWNlbWl4LWNvbW1vbnMKLSAgICAgKiBpbnRvIHRoZSBjb21wb25lbnQgdGhpcyBhbGxvd3MgdG8geW91IGJ5cGFzcyBhY3R1YWxseSBoYXZpbmcgdG8gY3JlYXRlIGEKLSAgICAgKiBib290c3RyYXAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5qZWN0Qm9vdFN0cmFwKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgZGVmYXVsdEJvb3RTdHJhcCA9IGdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICJvcmcvYXBhY2hlL3NlcnZpY2VtaXgvY29tbW9uL0RlZmF1bHRCb290c3RyYXAuY2xhc3MiKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5VVJMVG9GaWxlKGRlZmF1bHRCb290U3RyYXAsIGRlZmF1bHRCb290c3RyYXBGaWxlKTsKLSAgICAgICAgICAgIGJvb3RzdHJhcCA9ICJvcmcuYXBhY2hlLnNlcnZpY2VtaXguY29tbW9uLkRlZmF1bHRCb290c3RyYXAiOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjb3B5IERlZmF1bHRCb290c3RyYXAuY2xhc3MgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVmYXVsdEJvb3RzdHJhcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSmJpRGVzY3JpcHRvcigpIHRocm93cyBKYmlQbHVnaW5FeGNlcHRpb24gewotICAgICAgICBGaWxlIG91dHB1dERpciA9IG5ldyBGaWxlKGdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvbik7Ci0gICAgICAgIGlmICghb3V0cHV0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXRwdXREaXIubWtkaXJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIGRlc2NyaXB0b3IgPSBuZXcgRmlsZShvdXRwdXREaXIsIEpCSV9ERVNDUklQVE9SKTsKLQotICAgICAgICBMaXN0IHVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIERlcGVuZGVuY3lJbmZvcm1hdGlvbiBpbmZvID0gbmV3IERlcGVuZGVuY3lJbmZvcm1hdGlvbigpOwotICAgICAgICBpbmZvLnNldEZpbGVuYW1lKExJQl9ESVJFQ1RPUlkgKyAiLyIgKyBwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0RmluYWxOYW1lKCkgKyAiLmphciIpOwotICAgICAgICBpbmZvLnNldFZlcnNpb24ocHJvamVjdC5nZXRWZXJzaW9uKCkpOwotICAgICAgICBpbmZvLnNldE5hbWUocHJvamVjdC5nZXRBcnRpZmFjdElkKCkpOwotICAgICAgICBpbmZvLnNldFR5cGUoImphciIpOwotICAgICAgICB1cmlzLmFkZChpbmZvKTsKLQotICAgICAgICBBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgQXJ0aWZhY3RGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEFydGlmYWN0IGFydGlmYWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFhcnRpZmFjdC5pc09wdGlvbmFsKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChhcnRpZmFjdC5nZXRTY29wZSgpID09IEFydGlmYWN0LlNDT1BFX1JVTlRJTUUgfHwgYXJ0aWZhY3QuZ2V0U2NvcGUoKSA9PSBBcnRpZmFjdC5TQ09QRV9DT01QSUxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotCi0gICAgICAgIEpiaVJlc29sdXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IHJlc29sdmVQcm9qZWN0KCk7Ci0gICAgICAgIFNldDxBcnRpZmFjdD4gaW5jbHVkZXMgPSBuZXcgSGFzaFNldDxBcnRpZmFjdD4oKTsKLSAgICAgICAgU2V0PEFydGlmYWN0PiBleGNsdWRlcyA9IG5ldyBIYXNoU2V0PEFydGlmYWN0PigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGZpbHRlci5pbmNsdWRlKGFydGlmYWN0KSkgewotICAgICAgICAgICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gcHJvamVjdEJ1aWxkZXIuYnVpbGRGcm9tUmVwb3NpdG9yeShhcnRpZmFjdCwgcmVtb3RlUmVwb3MsIGxvY2FsUmVwbyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIGRldGVybWluZSBwYWNrYWdpbmcgZm9yIGRlcGVuZGVuY3kgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSArICIgYXNzdW1pbmcgamFyIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXRQYWNrYWdpbmcoKSA6IGFydGlmYWN0LmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoU0hBUkVEX0xJQlJBUllfVFlQRS5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBjaGlsZHJlbiwgYnV0IG5vdCB0aGUgc2hhcmVkIGxpYnJhcnkgaXRzZWxmCi0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVCcmFuY2gobGlzdGVuZXIuZ2V0Tm9kZShhcnRpZmFjdCksIGV4Y2x1ZGVzKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXMucmVtb3ZlKGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMuYWRkKGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudFR5cGVzLmNvbnRhaW5zKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzLmFkZChhcnRpZmFjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBydW5lVHJlZShsaXN0ZW5lci5nZXRSb290Tm9kZSgpLCBleGNsdWRlcyk7Ci0gICAgICAgIC8vIHByaW50KGxpc3RlbmVyLmdldFJvb3ROb2RlKCksICIiKTsKLSAgICAgICAgZm9yIChBcnRpZmFjdCBhcnRpZmFjdCA6IHJldGFpbkFydGlmYWN0cyhpbmNsdWRlcywgbGlzdGVuZXIpKSB7Ci0gICAgICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHByb2plY3QgPSBwcm9qZWN0QnVpbGRlci5idWlsZEZyb21SZXBvc2l0b3J5KGFydGlmYWN0LCByZW1vdGVSZXBvcywgbG9jYWxSZXBvKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIGRldGVybWluZSBwYWNrYWdpbmcgZm9yIGRlcGVuZGVuY3kgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIiBhc3N1bWluZyBqYXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB0eXBlID0gcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXRQYWNrYWdpbmcoKSA6IGFydGlmYWN0LmdldFR5cGUoKTsKLSAgICAgICAgICAgIGluZm8gPSBuZXcgRGVwZW5kZW5jeUluZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICBpbmZvLnNldEZpbGVuYW1lKExJQl9ESVJFQ1RPUlkgKyAiLyIgKyBhcnRpZmFjdC5nZXRGaWxlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGluZm8uc2V0VmVyc2lvbihhcnRpZmFjdC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgaW5mby5zZXROYW1lKGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgICAgICBpbmZvLnNldFR5cGUodHlwZSk7Ci0gICAgICAgICAgICB1cmlzLmFkZChpbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIEpiaUNvbXBvbmVudERlc2NyaXB0b3JXcml0ZXIgd3JpdGVyID0gbmV3IEpiaUNvbXBvbmVudERlc2NyaXB0b3JXcml0ZXIoZW5jb2RpbmcpOwotICAgICAgICB3cml0ZXIud3JpdGUoZGVzY3JpcHRvciwgY29tcG9uZW50LCBib290c3RyYXAsIHR5cGUsIG5hbWUsIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzTG9hZGVyRGVsZWdhdGlvbiwgYm9vdHN0cmFwQ2xhc3NMb2FkZXJEZWxlZ2F0aW9uLAotICAgICAgICAgICAgICAgIHVyaXMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlQ29tcG9uZW50TW9qby5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlQ29tcG9uZW50TW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzY0YmEyLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9HZW5lcmF0ZUNvbXBvbmVudE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcmNoaXZlci5NYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5TY29wZUFydGlmYWN0RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLkFydGlmYWN0RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuSmFyQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuTWFuaWZlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLQotLyoqCi0gKiBBIE1vam8gdXNlZCB0byBidWlsZCB0aGUgamJpIGNvbXBvbmVudCBpbnN0YWxsZXIgZmlsZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJnbm9kZXRAYXBhY2hlLm9yZyI+R3VpbGxhdW1lIE5vZGV0PC9hPgotICogQHZlcnNpb24gJElkOiBHZW5lcmF0ZUFwcGxpY2F0aW9uWG1sTW9qby5qYXZhIDMxNDk1NiAyMDA1LTEwLTEyIDE2OjI3OjE1WgotICogICAgICAgICAgYnJldHQgJAotICogQGdvYWwgamJpLWNvbXBvbmVudAotICogQHBoYXNlIHBhY2thZ2UKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqIEBkZXNjcmlwdGlvbiBnZW5lcmF0ZXMgdGhlIGNvbXBvbmVudCBpbnN0YWxsZXIKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlQ29tcG9uZW50TW9qbyBleHRlbmRzIEFic3RyYWN0SmJpTW9qbyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IGZvciB0aGUgZ2VuZXJhdGVkIEpCSSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCB3YXIuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmaW5hbE5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHdhci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9LWluc3RhbGxlci56aXAiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5zdGFsbGVyTmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBaaXAgYXJjaGl2ZXIuCi0gICAgICogCi0gICAgICogQGNvbXBvbmVudCByb2xlPSJvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyIiByb2xlSGludD0iamFyIgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgSmFyQXJjaGl2ZXIgamFyQXJjaGl2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTaW5nbGUgZGlyZWN0b3J5IGZvciBleHRyYSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBKQkkgY29tcG9uZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtiYXNlZGlyfS9zcmMvbWFpbi9qYmkiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGpiaVNvdXJjZURpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXZlbiBhcmNoaXZlIGNvbmZpZ3VyYXRpb24gdG8gdXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24gYXJjaGl2ZSA9IG5ldyBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBsaXN0IG9mIGRlcGVuZGVuY3kgdHlwZXMgdG8gaW5jbHVkZSBpbiBjb21wb25lbnQgY2xhc3NwYXRoLgotICAgICAqIERlZmF1bHQ6IGphciwgYnVuZGxlLCBqYmktY29tcG9uZW50Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBjb21wb25lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117ImphciIsICJidW5kbGUiLCAiamJpLWNvbXBvbmVudCJ9KSk7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLQotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiID09PT09PT0gR2VuZXJhdGVJbnN0YWxsZXJNb2pvIHNldHRpbmdzID09PT09PT0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIndvcmtEaXJlY3RvcnlbIiArIHdvcmtEaXJlY3RvcnkgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiaW5zdGFsbGVyTmFtZVsiICsgaW5zdGFsbGVyTmFtZSArICJdIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJqYmlTb3VyY2VEaXJlY3RvcnlbIiArIGpiaVNvdXJjZURpcmVjdG9yeSArICJdIik7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgY3JlYXRlVW5wYWNrZWRJbnN0YWxsZXIoKTsKLQotICAgICAgICAgICAgRmlsZSBpbnN0YWxsZXJGaWxlID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBpbnN0YWxsZXJOYW1lKTsKLSAgICAgICAgICAgIGNyZWF0ZUFyY2hpdmUoaW5zdGFsbGVyRmlsZSk7Ci0KLSAgICAgICAgICAgIHByb2plY3RIZWxwZXIuYXR0YWNoQXJ0aWZhY3QocHJvamVjdCwgInppcCIsICJpbnN0YWxsZXIiLCBuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5LCBpbnN0YWxsZXJOYW1lKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSmJpUGx1Z2luRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGluc3RhbGxlciIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFyY2hpdmUoRmlsZSBpbnN0YWxsZXJGaWxlKSB0aHJvd3MgSmJpUGx1Z2luRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gZ2VuZXJhdGUgd2FyIGZpbGUKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oCi0gICAgICAgICAgICAgICAgICAgICJHZW5lcmF0aW5nIGluc3RhbGxlciAiICsgaW5zdGFsbGVyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBNYXZlbkFyY2hpdmVyIGFyY2hpdmVyID0gbmV3IE1hdmVuQXJjaGl2ZXIoKTsKLSAgICAgICAgICAgIGFyY2hpdmVyLnNldEFyY2hpdmVyKGphckFyY2hpdmVyKTsKLSAgICAgICAgICAgIGFyY2hpdmVyLnNldE91dHB1dEZpbGUoaW5zdGFsbGVyRmlsZSk7Ci0gICAgICAgICAgICBqYXJBcmNoaXZlci5hZGREaXJlY3Rvcnkod29ya0RpcmVjdG9yeSk7Ci0gICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGNyZWF0ZU1hbmlmZXN0KCk7Ci0gICAgICAgICAgICBqYXJBcmNoaXZlci5hZGRDb25maWd1cmVkTWFuaWZlc3QobWFuaWZlc3QpOwotICAgICAgICAgICAgaWYgKGpiaVNvdXJjZURpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgamFyQXJjaGl2ZXIuYWRkRGlyZWN0b3J5KGpiaVNvdXJjZURpcmVjdG9yeSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIuREVGQVVMVEVYQ0xVREVTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhcmNoaXZlCi0gICAgICAgICAgICBhcmNoaXZlci5jcmVhdGVBcmNoaXZlKGdldFByb2plY3QoKSwgYXJjaGl2ZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoQXJjaGl2ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpiaVBsdWdpbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgYXNzZW1ibHk6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbmlmZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIGFzc2VtYmx5OiAiCi0gICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmJpUGx1Z2luRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBhc3NlbWJseTogIgotICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmJpUGx1Z2luRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBhc3NlbWJseTogIgotICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVVucGFja2VkSW5zdGFsbGVyKCkgdGhyb3dzIEpiaVBsdWdpbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCF3b3JrRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkgJiYgIXdvcmtEaXJlY3RvcnkubWtkaXJzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgd29yayBkaXJlY3Rvcnk6ICIgKyB3b3JrRGlyZWN0b3J5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgcHJvamVjdEFydGlmYWN0ID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBmaW5hbE5hbWUgKyAiLmphciIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkocHJvamVjdEFydGlmYWN0LCBuZXcgRmlsZSh3b3JrRGlyZWN0b3J5LCBMSUJfRElSRUNUT1JZKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIlVuYWJsZSB0byBjb3B5IGZpbGUgIgotICAgICAgICAgICAgICAgICAgICArIHByb2plY3RBcnRpZmFjdCwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgQXJ0aWZhY3RGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEFydGlmYWN0IGFydGlmYWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFhcnRpZmFjdC5pc09wdGlvbmFsKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChhcnRpZmFjdC5nZXRTY29wZSgpID09IEFydGlmYWN0LlNDT1BFX1JVTlRJTUUgfHwgYXJ0aWZhY3QuZ2V0U2NvcGUoKSA9PSBBcnRpZmFjdC5TQ09QRV9DT01QSUxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBKYmlSZXNvbHV0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSByZXNvbHZlUHJvamVjdCgpOwotICAgICAgICBpZiAoZ2V0TG9nKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgcHJpbnQobGlzdGVuZXIuZ2V0Um9vdE5vZGUoKSwgIiAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldDxBcnRpZmFjdD4gaW5jbHVkZXMgPSBuZXcgSGFzaFNldDxBcnRpZmFjdD4oKTsKLSAgICAgICAgU2V0PEFydGlmYWN0PiBleGNsdWRlcyA9IG5ldyBIYXNoU2V0PEFydGlmYWN0PigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGZpbHRlci5pbmNsdWRlKGFydGlmYWN0KSkgewotICAgICAgICAgICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gcHJvamVjdEJ1aWxkZXIuYnVpbGRGcm9tUmVwb3NpdG9yeShhcnRpZmFjdCwgcmVtb3RlUmVwb3MsIGxvY2FsUmVwbyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIGRldGVybWluZSBwYWNrYWdpbmcgZm9yIGRlcGVuZGVuY3kgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzc3VtaW5nIGphciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0UGFja2FnaW5nKCkgOiBhcnRpZmFjdC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCJqYmktc2hhcmVkLWxpYnJhcnkiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBleGNsdWRlQnJhbmNoKGxpc3RlbmVyLmdldE5vZGUoYXJ0aWZhY3QpLCBleGNsdWRlcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlcy5jb250YWlucyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcy5hZGQoYXJ0aWZhY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcnVuZVRyZWUobGlzdGVuZXIuZ2V0Um9vdE5vZGUoKSwgZXhjbHVkZXMpOwotICAgICAgICBpZiAoZ2V0TG9nKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiRXhjbHVkZXM6ICIgKyBleGNsdWRlcyk7Ci0gICAgICAgICAgICBwcmludChsaXN0ZW5lci5nZXRSb290Tm9kZSgpLCAiICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChBcnRpZmFjdCBhcnRpZmFjdCA6IHJldGFpbkFydGlmYWN0cyhpbmNsdWRlcywgbGlzdGVuZXIpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIkluY2x1ZGluZzogIiArIGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShhcnRpZmFjdC5nZXRGaWxlKCksIG5ldyBGaWxlKHdvcmtEaXJlY3RvcnksIExJQl9ESVJFQ1RPUlkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpUGx1Z2luRXhjZXB0aW9uKCJVbmFibGUgdG8gY29weSBmaWxlICIgKyBhcnRpZmFjdC5nZXRGaWxlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvR2VuZXJhdGVEZXBlbmRzRmlsZU1vam8uamF2YSBiL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9HZW5lcmF0ZURlcGVuZHNGaWxlTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBmYzQ0Li4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9HZW5lcmF0ZURlcGVuZHNGaWxlTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLkRlcGVuZGVuY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRlcGVuZGVuY2llcyBwcm9wZXJ0aWVzIGZpbGUKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6ICQKLSAqIEBnb2FsIGdlbmVyYXRlLWRlcGVuZHMtZmlsZQotICogQHBoYXNlIGdlbmVyYXRlLXJlc291cmNlcwotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyB0aGUgZGVwZW5kZW5jaWVzIHByb3BlcnRpZXMgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVEZXBlbmRzRmlsZU1vam8gZXh0ZW5kcyBBYnN0cmFjdEpiaU1vam8gewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIi8iOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGUgdG8gZ2VuZXJhdGUKLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlcy9NRVRBLUlORi9tYXZlbi9kZXBlbmRlbmNpZXMucHJvcGVydGllcyIKLSAgICAgKi8KLSAgICAKLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RmlsZTsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dHB1dEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICBQcmludFN0cmVhbSBwcmludGVyID0gbmV3IFByaW50U3RyZWFtKG91dCk7Ci0gICAgICAgICAgICBwb3B1bGF0ZVByb3BlcnRpZXMocHJpbnRlcik7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJDcmVhdGVkOiAiICsgb3V0cHV0RmlsZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBkZXBlbmRlbmNpZXMgZmlsZTogIiArIGUsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJGYWlsZWQgdG8gY2xvc2U6ICIgKyBvdXRwdXRGaWxlICsgIi4gUmVhc29uOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQcm9wZXJ0aWVzKFByaW50U3RyZWFtIG91dCkgewotICAgICAgICBvdXQucHJpbnRsbigiIyBQcm9qZWN0IGRlcGVuZGVuY2llcyBnZW5lcmF0ZWQgYnkgdGhlIEFwYWNoZSBTZXJ2aWNlTWl4IE1hdmVuIFBsdWdpbiIpOwotICAgICAgICBvdXQucHJpbnRsbigiIyBHZW5lcmF0ZWQgYXQ6ICIgKyBuZXcgRGF0ZSgpKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLQotICAgICAgICBvdXQucHJpbnRsbigiZ3JvdXBJZCA9ICIgKyBwcm9qZWN0LmdldEdyb3VwSWQoKSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJhcnRpZmFjdElkID0gIiArIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpKTsKLSAgICAgICAgb3V0LnByaW50bG4oInZlcnNpb24gPSAiICsgcHJvamVjdC5nZXRWZXJzaW9uKCkpOwotICAgICAgICBvdXQucHJpbnRsbihwcm9qZWN0LmdldEdyb3VwSWQoKSArIFNFUEFSQVRPUiArIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgU0VQQVJBVE9SICsgInZlcnNpb24gPSAiICsgcHJvamVjdC5nZXRWZXJzaW9uKCkpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICBvdXQucHJpbnRsbigiIyBkZXBlbmRlbmNpZXMiKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHByb2plY3QuZ2V0RGVwZW5kZW5jaWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gKERlcGVuZGVuY3kpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBkZXBlbmRlbmN5LmdldEdyb3VwSWQoKSArIFNFUEFSQVRPUiArIGRlcGVuZGVuY3kuZ2V0QXJ0aWZhY3RJZCgpICsgU0VQQVJBVE9SOwotICAgICAgICAgICAgb3V0LnByaW50bG4ocHJlZml4ICsgInZlcnNpb24gPSAiICsgZGVwZW5kZW5jeS5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzaWZpZXIgPSBkZXBlbmRlbmN5LmdldENsYXNzaWZpZXIoKTsKLSAgICAgICAgICAgIGlmIChjbGFzc2lmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihwcmVmaXggKyAiY2xhc3NpZmllciA9ICIgKyBjbGFzc2lmaWVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5wcmludGxuKHByZWZpeCArICJ0eXBlID0gIiArIGRlcGVuZGVuY3kuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKHByZWZpeCArICJzY29wZSA9ICIgKyBkZXBlbmRlbmN5LmdldFNjb3BlKCkpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKLQotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkRlcGVuZGVuY3k6ICIgKyBkZXBlbmRlbmN5ICsgIiBjbGFzc2lmaWVyOiAiICsgY2xhc3NpZmllciArICIgdHlwZTogIiArIGRlcGVuZGVuY3kuZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvR2VuZXJhdGVTZXJ2aWNlQXNzZW1ibHlEZXNjcmlwdG9yTW9qby5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlU2VydmljZUFzc2VtYmx5RGVzY3JpcHRvck1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwN2JhOS4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvR2VuZXJhdGVTZXJ2aWNlQXNzZW1ibHlEZXNjcmlwdG9yTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5TY29wZUFydGlmYWN0RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuRGVwZW5kZW5jeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuUHJvZmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLmlvLnhwcDMuTWF2ZW5YcHAzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5jb21tb24ucGFja2FnaW5nLkNvbnN1bWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5jb21tb24ucGFja2FnaW5nLlByb3ZpZGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci0KLS8qKgotICogQSBNb2pvIHVzZWQgdG8gYnVpbGQgdGhlIGpiaS54bWwgZmlsZSBmb3IgYSBzZXJ2aWNlIHVuaXQuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0icGRvZGRzQGFwYWNoZS5vcmciPlBoaWxpcCBEb2RkczwvYT4KLSAqIEB2ZXJzaW9uICRJZDogR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qbyAzMTQ5NTYgMjAwNS0xMC0xMiAxNjoyNzoxNVoKLSAqICAgICAgICAgIGJyZXR0ICQKLSAqIEBnb2FsIGdlbmVyYXRlLWpiaS1zZXJ2aWNlLWFzc2VtYmx5LWRlc2NyaXB0b3IKLSAqIEBwaGFzZSBnZW5lcmF0ZS1yZXNvdXJjZXMKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqIEBkZXNjcmlwdGlvbiBnZW5lcmF0ZXMgdGhlIGpiaS54bWwgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBhIHNlcnZpY2UgdW5pdAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVTZXJ2aWNlQXNzZW1ibHlEZXNjcmlwdG9yTW9qbyBleHRlbmRzIEFic3RyYWN0SmJpTW9qbyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQklfTkFNRVNQQUNFID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2piaSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0KLSAgICBwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgQ29uc3VtZXMgY29uc3VtZXM7Ci0KLSAgICAgICAgcHJpdmF0ZSBQcm92aWRlcyBwcm92aWRlczsKLQotICAgICAgICBwdWJsaWMgQ29uc3VtZXMgZ2V0Q29uc3VtZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29uc3VtZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb25zdW1lcyhDb25zdW1lcyBjb25zdW1lcykgewotICAgICAgICAgICAgdGhpcy5jb25zdW1lcyA9IGNvbnN1bWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFByb3ZpZGVzIGdldFByb3ZpZGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXMoUHJvdmlkZXMgcHJvdmlkZXMpIHsKLSAgICAgICAgICAgIHRoaXMucHJvdmlkZXMgPSBwcm92aWRlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIGpiaS54bWwgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBub3QuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgQm9vbGVhbiBnZW5lcmF0ZUpiaURlc2NyaXB0b3IgPSBCb29sZWFuLlRSVUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29tcG9uZW50IG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYXJ0aWZhY3RJZH0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb21wb25lbnQgZGVzY3JpcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QubmFtZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBhcHBsaWNhdGlvbi54bWwgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBVVEZfODsKLQotICAgIC8qKgotICAgICAqIERpcmVjdG9yeSB3aGVyZSB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGUgd2lsbCBiZSBhdXRvLWdlbmVyYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXMvTUVUQS1JTkYiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVkRGVzY3JpcHRvckxvY2F0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxvY2F0aW9uIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSBjb25uZWN0aW9ucyBlbGVtZW50cyB0aGF0IGNhbiBiZQotICAgICAqIG1lcmdlZCBpbnRvIHRoZSBqYmkueG1sCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9qYmktY29ubmVjdGlvbnMueG1sIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBqYmlDb25uZWN0aW9uc0ZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRlbmN5IGdyYXBoCi0gICAgICovCi0gICAgcHJpdmF0ZSBKYmlSZXNvbHV0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLQotICAgICAgICBnZXRMb2coKQotICAgICAgICAgICAgICAgIC5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICIgPT09PT09PSBHZW5lcmF0ZVNlcnZpY2VBc3NlbWxieURlc2NyaXB0b3JNb2pvIHNldHRpbmdzID09PT09PT0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIndvcmtEaXJlY3RvcnlbIiArIHdvcmtEaXJlY3RvcnkgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiZ2VuZXJhdGVKYmlEZXNjcmlwdG9yWyIgKyBnZW5lcmF0ZUpiaURlc2NyaXB0b3IgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygibmFtZVsiICsgbmFtZSArICJdIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJkZXNjcmlwdGlvblsiICsgZGVzY3JpcHRpb24gKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiZW5jb2RpbmdbIiArIGVuY29kaW5nICsgIl0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgImdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvblsiICsgZ2VuZXJhdGVkRGVzY3JpcHRvckxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0KLSAgICAgICAgaWYgKCFnZW5lcmF0ZUpiaURlc2NyaXB0b3IuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW9uIG9mIGpiaS54bWwgaXMgZGlzYWJsZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdlbmVyYXRlIGpiaSBkZXNjcmlwdG9yIGFuZCBjb3B5IGl0IHRvIHRoZSBidWlsZCBkaXJlY3RvcnkKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBqYmkueG1sIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsaXN0ZW5lciA9IHJlc29sdmVQcm9qZWN0KCk7Ci0gICAgICAgICAgICBnZW5lcmF0ZUpiaURlc2NyaXB0b3IoKTsKLSAgICAgICAgfSBjYXRjaCAoSmJpUGx1Z2luRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2VuZXJhdGUgamJpLnhtbCIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KG5ldyBGaWxlKGdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgSkJJX0RFU0NSSVBUT1IpLCBuZXcgRmlsZShnZXRXb3JrRGlyZWN0b3J5KCksIE1FVEFfSU5GKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNvcHkgamJpLnhtbCB0byBmaW5hbCBkZXN0aW5hdGlvbiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSmJpRGVzY3JpcHRvcigpIHRocm93cyBKYmlQbHVnaW5FeGNlcHRpb24sCi0gICAgICAgICAgICBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBvdXRwdXREaXIgPSBuZXcgRmlsZShnZW5lcmF0ZWREZXNjcmlwdG9yTG9jYXRpb24pOwotICAgICAgICBpZiAoIW91dHB1dERpci5leGlzdHMoKSkgewotICAgICAgICAgICAgb3V0cHV0RGlyLm1rZGlycygpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBkZXNjcmlwdG9yID0gbmV3IEZpbGUob3V0cHV0RGlyLCBKQklfREVTQ1JJUFRPUik7Ci0KLSAgICAgICAgTGlzdCBzZXJ2aWNlVW5pdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgU2V0IGFydGlmYWN0cyA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgCQotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgLy8gVE9ETzogdXRpbGlzZSBhcHByb3ByaWF0ZSBtZXRob2RzIGZyb20gcHJvamVjdCBidWlsZGVyCi0gICAgICAgICAgICBTY29wZUFydGlmYWN0RmlsdGVyIGZpbHRlciA9IG5ldyBTY29wZUFydGlmYWN0RmlsdGVyKAotICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdC5TQ09QRV9SVU5USU1FKTsKLSAgICAgICAgICAgIGlmICghYXJ0aWZhY3QuaXNPcHRpb25hbCgpICYmIGZpbHRlci5pbmNsdWRlKGFydGlmYWN0KQotICAgICAgICAgICAgICAgICAgICAmJiAoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeVRyYWlsKCkuc2l6ZSgpID09IDIpKSB7Ci0gICAgICAgICAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSBwcm9qZWN0QnVpbGRlci5idWlsZEZyb21SZXBvc2l0b3J5KGFydGlmYWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZVJlcG9zLCBsb2NhbFJlcG8pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgcGFja2FnaW5nIGZvciBkZXBlbmRlbmN5IDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhc3N1bWluZyBqYXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChwcm9qZWN0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvamVjdC5nZXRQYWNrYWdpbmcoKS5lcXVhbHMoImpiaS1zZXJ2aWNlLXVuaXQiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW5jeUluZm9ybWF0aW9uIGluZm8gPSBuZXcgRGVwZW5kZW5jeUluZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8uc2V0TmFtZShhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBhcnRpZmFjdC5nZXRGaWxlKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5hbWUgaXMgbm90IGRlZmluZWQgaW4gdGhlIFBPTQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSB0aGUgYXJ0aWZhY3RJZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIGFydGlmYWN0SWQgaXMgbWFuZGF0b3J5IGJ5IG1hdmVuLCB3ZSBkb24ndAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCBhbnkgYWRkaXRpb25hbCB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGFydGlmYWN0LmdldEFydGlmYWN0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUuZXF1YWxzKCJjbGFzc2VzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgCWZpbGVOYW1lID0gYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi0iICsgYXJ0aWZhY3QuZ2V0VmVyc2lvbigpICsgIi5qYXIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdU5hbWUgPSBnZXRTZXJ2aWNlVW5pdE5hbWUocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdU5hbWUgIT0gbnVsbCAmJiBzdU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlmaWxlTmFtZSA9IHN1TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgCWZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykpICsgIi56aXAiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluZm8uc2V0RmlsZW5hbWUoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLnNldENvbXBvbmVudChnZXRDb21wb25lbnROYW1lKHByb2plY3QsIGFydGlmYWN0cywgYXJ0aWZhY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5zZXREZXNjcmlwdGlvbihwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlVW5pdHMuYWRkKGluZm8pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBvcmRlcmVkU2VydmljZVVuaXRzID0gcmVvcmRlclNlcnZpY2VVbml0cyhzZXJ2aWNlVW5pdHMpOwotCi0gICAgICAgIExpc3QgY29ubmVjdGlvbnMgPSBnZXRDb25uZWN0aW9ucygpOwotCi0gICAgICAgIEpiaVNlcnZpY2VBc3NlbWJseURlc2NyaXB0b3JXcml0ZXIgd3JpdGVyID0gbmV3IEpiaVNlcnZpY2VBc3NlbWJseURlc2NyaXB0b3JXcml0ZXIoCi0gICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotICAgICAgICB3cml0ZXIud3JpdGUoZGVzY3JpcHRvciwgbmFtZSwgZGVzY3JpcHRpb24sIG9yZGVyZWRTZXJ2aWNlVW5pdHMsCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gcmV0dXJuIGEgbGlzdCBvZiBjb25uZWN0aW9ucyBpZiB0aGV5IGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUKLSAgICAgKiBqYmlDb25uZWN0aW9uc0ZpbGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBjb25uZWN0aW9ucwotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBnZXRDb25uZWN0aW9ucygpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoamJpQ29ubmVjdGlvbnNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VDb25uZWN0aW9uc1htbCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBqYmlDb25uZWN0aW9uc0ZpbGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IHBhcnNlQ29ubmVjdGlvbnNYbWwoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZygpLmluZm8oCi0gICAgICAgICAgICAgICAgIlBpY2tpbmcgdXAgY29ubmVjdGlvbnMgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGpiaUNvbm5lY3Rpb25zRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIExpc3QgY29ubmVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKGpiaUNvbm5lY3Rpb25zRmlsZSk7Ci0KLSAgICAgICAgICAgIE5vZGUgc2VydmljZXNOb2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlc05vZGUgaW5zdGFuY2VvZiBFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAmJiBYbWxEZXNjcmlwdG9ySGVscGVyLmlzRWxlbWVudChzZXJ2aWNlc05vZGUsIEpCSV9OQU1FU1BBQ0UsICJjb25uZWN0aW9ucyIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBwcm9jZXNzIHRoZSBjaGlsZHJlbgotICAgICAgICAgICAgICAgIEVsZW1lbnQgc2VydmljZXNFbGVtZW50ID0gKEVsZW1lbnQpIHNlcnZpY2VzTm9kZTsKLSAgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHNlcnZpY2VzRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChYbWxEZXNjcmlwdG9ySGVscGVyLmlzRWxlbWVudChjaGlsZHJlbi5pdGVtKGkpLCBKQklfTkFNRVNQQUNFLCAiY29ubmVjdGlvbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgY29ubmVjdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4uaXRlbShpKS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGNvbm5lY3Rpb25DaGlsZHJlbi5nZXRMZW5ndGgoKTsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25DaGlsZHJlbi5pdGVtKHgpIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IChFbGVtZW50KSBjb25uZWN0aW9uQ2hpbGRyZW4uaXRlbSh4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbERlc2NyaXB0b3JIZWxwZXIuaXNFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCwgSkJJX05BTUVTUEFDRSwgImNvbnN1bWVyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bWVzIG5ld0NvbnN1bWVzID0gbmV3IENvbnN1bWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb25zdW1lcy5zZXRFbmRwb2ludE5hbWUoWG1sRGVzY3JpcHRvckhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludE5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb25zdW1lcy5zZXRJbnRlcmZhY2VOYW1lKFhtbERlc2NyaXB0b3JIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlTmFtZShjaGlsZEVsZW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnN1bWVzLnNldFNlcnZpY2VOYW1lKFhtbERlc2NyaXB0b3JIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZU5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldENvbnN1bWVzKG5ld0NvbnN1bWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChYbWxEZXNjcmlwdG9ySGVscGVyLmlzRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQsIEpCSV9OQU1FU1BBQ0UsICJwcm92aWRlciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlcyBuZXdQcm92aWRlcyA9IG5ldyBQcm92aWRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvdmlkZXMuc2V0RW5kcG9pbnROYW1lKFhtbERlc2NyaXB0b3JIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kcG9pbnROYW1lKGNoaWxkRWxlbWVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvdmlkZXMuc2V0SW50ZXJmYWNlTmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVyZmFjZU5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm92aWRlcy5zZXRTZXJ2aWNlTmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlcnZpY2VOYW1lKGNoaWxkRWxlbWVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRQcm92aWRlcyhuZXdQcm92aWRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJGb3VuZCAiICsgY29ubmVjdGlvbnMuc2l6ZSgpICsgIiBjb25uZWN0aW9ucyIpOwotICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25zOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSAiCi0gICAgICAgICAgICAgICAgICAgICsgamJpQ29ubmVjdGlvbnNGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlLW9yZGVycyB0aGUgc2VydmljZSB1bml0cyB0byBtYXRjaCBvcmRlciBpbiB0aGUgZGVwZW5kZW5jaWVzIHNlY3Rpb24gb2YKLSAgICAgKiB0aGUgcG9tCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcnZpY2VVbml0cwotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCByZW9yZGVyU2VydmljZVVuaXRzKExpc3Qgc2VydmljZVVuaXRzKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gVE9ETyBDdXJyZW50bHkgd2UgZ2V0IHRoZSBtb2RlbCBiYWNrIGJ5IHJlLXBhcnNpbmcgaXQgaG93ZXZlciBpbiB0aGUKLSAgICAgICAgLy8gZnV0dXJlIHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGUgZ2V0TW9kZWwoKSAtIHRoZXJlIHNob3VsZCBiZSBhCi0gICAgICAgIC8vIGZpeCBwb3N0IDIuMC40Ci0KLSAgICAgICAgLy8gSXRlcmF0b3IgZGVwZW5kZW5jaWVzID0KLSAgICAgICAgLy8gcHJvamVjdC5nZXRNb2RlbCgpLmdldERlcGVuZGVuY2llcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgLy8gRm9yIG5vdyB3ZSB3aWxsIG5lZWQgdG8gcmVwYXJzZSB0aGUgcG9tIHdpdGhvdXQgcHJvY2Vzc2luZwotICAgICAgICBJdGVyYXRvciBkZXBlbmRlbmNpZXMgPSBnZXRSZXBhcnNlZERlcGVuZGVuY2llcygpOwotCi0gICAgICAgIExpc3Qgb3JkZXJlZFNlcnZpY2VVbml0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGFyc2VEZXBlbmRlbmNpZXMoc2VydmljZVVuaXRzLCBkZXBlbmRlbmNpZXMsIG9yZGVyZWRTZXJ2aWNlVW5pdHMpOwotICAgICAgICAKLSAgICAgICAgLy9nZXQgY2hhbmNlIHRoZSBnbyB0aHJvdWdoIHRoZSBhY3RpdmUgcHJvZmlsZSBkZXBlbmRlbmNpZXMgc28gdGhhdCB0aGUgU1UgZGVwZW5kZW5jeSAKLSAgICAgICAgLy9mcm9tIGFjdGl2ZSBwcm9maWxlIGNhbiBhbHNvIGJlIHRha2VuIGludG8gYWNjb3VudAotCi0gICAgICAgIExpc3QgYWN0aXZlUHJvZmlsZUxpc3QgPSBwcm9qZWN0LmdldEFjdGl2ZVByb2ZpbGVzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2ZVByb2ZpbGVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFByb2ZpbGUgYWN0aXZlUHJvZmlsZSA9IChQcm9maWxlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBwYXJzZURlcGVuZGVuY2llcyhzZXJ2aWNlVW5pdHMsIGFjdGl2ZVByb2ZpbGUuZ2V0RGVwZW5kZW5jaWVzKCkuaXRlcmF0b3IoKSwgb3JkZXJlZFNlcnZpY2VVbml0cyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3JkZXJlZFNlcnZpY2VVbml0czsKLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VEZXBlbmRlbmNpZXMoTGlzdCBzZXJ2aWNlVW5pdHMsIEl0ZXJhdG9yIGRlcGVuZGVuY2llcywKLQkJCUxpc3Qgb3JkZXJlZFNlcnZpY2VVbml0cykgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZGVwZW5kZW5jaWVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gKERlcGVuZGVuY3kpIGRlcGVuZGVuY2llcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5nZXRBcnRpZmFjdElkKCkuY29udGFpbnMoIiR7IikpIHsKLSAgICAgICAgICAgICAgICBpbnQgZmlyc3QgPSBkZXBlbmRlbmN5LmdldEFydGlmYWN0SWQoKS5pbmRleE9mKCIkeyIpOwotICAgICAgICAgICAgICAgIGludCBsYXN0ICA9IGRlcGVuZGVuY3kuZ2V0QXJ0aWZhY3RJZCgpLmluZGV4T2YoIn0iKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBkZXBlbmRlbmN5LmdldEFydGlmYWN0SWQoKS5zdWJzdHJpbmcoZmlyc3QgKyAyLCBsYXN0KTsKLSAgICAgICAgICAgICAgICBPYmplY3QgcHJvcFZhbHVlID0gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0KHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5ICIgKyBwcm9wZXJ0eSArICJpcyBub3Qgc2V0LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJKYmkgZGVzY3JpcHRvciBtYXkgbm90IGJlIGdlbmVyYXRlZCBwcm9wZXJseSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcFN0cmluZyA9IChTdHJpbmcpIHByb3BWYWx1ZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXJ0aWZhY3RJRCA9IGRlcGVuZGVuY3kuZ2V0QXJ0aWZhY3RJZCgpLnJlcGxhY2UoIiR7IiArIHByb3BlcnR5ICsgIn0iLCBwcm9wU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LnNldEFydGlmYWN0SWQoYXJ0aWZhY3RJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VydmljZVVuaXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBEZXBlbmRlbmN5SW5mb3JtYXRpb24gc2VydmljZVVuaXRJbmZvID0gKERlcGVuZGVuY3lJbmZvcm1hdGlvbikgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kuZ2V0QXJ0aWZhY3RJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNlcnZpY2VVbml0SW5mby5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgCS8vY2hlY2sgaWYgdGhpcyBzdSBhbHJlYWR5IGFkZGVkIHRvIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAJYm9vbGVhbiBhZGRlZFN1ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgCWZvciAoSXRlcmF0b3IgaW5uZXJJdCA9IG9yZGVyZWRTZXJ2aWNlVW5pdHMuaXRlcmF0b3IoKTtpbm5lckl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAJCURlcGVuZGVuY3lJbmZvcm1hdGlvbiBhZGRlZFNlcnZpY2VVbml0SW5mbyA9IChEZXBlbmRlbmN5SW5mb3JtYXRpb24pIGlubmVySXQubmV4dCgpOwotICAgICAgICAgICAgICAgIAkJaWYgKGFkZGVkU2VydmljZVVuaXRJbmZvLmdldE5hbWUoKS5lcXVhbHMoc2VydmljZVVuaXRJbmZvLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAJCQlhZGRlZFN1ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAJCX0KLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIAlpZiAoIWFkZGVkU3UpIHsKLSAgICAgICAgICAgICAgICAJCWdldExvZygpLmRlYnVnKCJBZGRpbmcgIiArIHNlcnZpY2VVbml0SW5mby5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgICAgICAgICAJCW9yZGVyZWRTZXJ2aWNlVW5pdHMuYWRkKHNlcnZpY2VVbml0SW5mbyk7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQotICAgIHByaXZhdGUgSXRlcmF0b3IgZ2V0UmVwYXJzZWREZXBlbmRlbmNpZXMoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hdmVuWHBwM1JlYWRlciBtYXZlblhwcDNSZWFkZXIgPSBuZXcgTWF2ZW5YcHAzUmVhZGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNb2RlbCBtb2RlbCA9IG1hdmVuWHBwM1JlYWRlci5yZWFkKG5ldyBGaWxlUmVhZGVyKG5ldyBGaWxlKHByb2plY3QKLSAgICAgICAgICAgICAgICAgICAgLmdldEJhc2VkaXIoKSwgInBvbS54bWwiKSksIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBtb2RlbC5nZXREZXBlbmRlbmNpZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byByZXBhcnNlIHRoZSBwb20ueG1sIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb21wb25lbnROYW1lKE1hdmVuUHJvamVjdCBwcm9qZWN0LCBTZXQgYXJ0aWZhY3RzLAotICAgICAgICAgICAgQXJ0aWZhY3Qgc3VBcnRpZmFjdCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGdldExvZygpLmluZm8oCi0gICAgICAgICAgICAgICAgIkRldGVybWluaW5nIGNvbXBvbmVudCBuYW1lIGZvciBzZXJ2aWNlIHVuaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgIGlmIChwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgiY29tcG9uZW50TmFtZSIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgiY29tcG9uZW50TmFtZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSmJpUmVzb2x1dGlvbkxpc3RlbmVyLk5vZGUgbiA9IGxpc3RlbmVyLmdldE5vZGUoc3VBcnRpZmFjdCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBuLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSmJpUmVzb2x1dGlvbkxpc3RlbmVyLk5vZGUgY2hpbGQgPSAoSmJpUmVzb2x1dGlvbkxpc3RlbmVyLk5vZGUpIGl0Ci0gICAgICAgICAgICAgICAgICAgIC5uZXh0KCk7Ci0gICAgICAgICAgICBNYXZlblByb2plY3QgYXJ0aWZhY3RQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbyhjaGlsZC5nZXRBcnRpZmFjdCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGFydGlmYWN0UHJvamVjdCA9IHByb2plY3RCdWlsZGVyCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZEZyb21SZXBvc2l0b3J5KGNoaWxkLmdldEFydGlmYWN0KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVSZXBvcywgbG9jYWxSZXBvKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZXJtaW5lIHBhY2thZ2luZyBmb3IgZGVwZW5kZW5jeSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjaGlsZC5nZXRBcnRpZmFjdCgpLmdldEFydGlmYWN0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXNzdW1pbmcgamFyIik7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoZSk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgICAgIAotICAgICAgICAgICAgaWYgKGFydGlmYWN0UHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9qZWN0ICIgKyBhcnRpZmFjdFByb2plY3QgKyAiIHBhY2thZ2VkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3RQcm9qZWN0LmdldFBhY2thZ2luZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoYXJ0aWZhY3RQcm9qZWN0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICYmIChhcnRpZmFjdFByb2plY3QuZ2V0UGFja2FnaW5nKCkuZXF1YWxzKCJqYmktY29tcG9uZW50IikpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmdldEFydGlmYWN0KCkuZ2V0QXJ0aWZhY3RJZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL2FzIHRoZSBqYmktY29tcG9uZW50IHBhY2thZ2VkIGRlcGVuZGVuY3kgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHBydW5lZAotICAgICAgICAvL2luIGNhc2Ugb2YgbXVsdGlwbGUgc3VzIHdoaWNoIGJlbG9uZyB0byBzYW1lIGpiaS1jb21wb25lbnQgZXhpc3QgaW4gb25lIHNhLCBzbyB3ZQotICAgICAgICAvL2p1c3QgY2hlY2sgdGhlIGRlcGVuZGVuY2llcyBmcm9tIHRoaXMgc3UgbWF2ZW4gcHJvamVjdCB0byBmaW5kIHRoZSBqYmktY29tcG9uZW50IG5hbWUKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0SW5TVVBvbSA9IChBcnRpZmFjdCkgaXQKLSAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLSAgICAgICAgICAgIE1hdmVuUHJvamVjdCBhcnRpZmFjdFByb2plY3QgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdFByb2plY3QgPSBwcm9qZWN0QnVpbGRlci5idWlsZEZyb21SZXBvc2l0b3J5KGFydGlmYWN0SW5TVVBvbQotICAgICAgICAgICAgICAgICAgICAgICAgLCByZW1vdGVSZXBvcywgbG9jYWxSZXBvKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZXJtaW5lIHBhY2thZ2luZyBmb3IgZGVwZW5kZW5jeSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcnRpZmFjdEluU1VQb20uZ2V0QXJ0aWZhY3RJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhc3N1bWluZyBqYXIiKTsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhlKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJ0aWZhY3RQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKAotICAgICAgICAgICAgICAgICAgICAiUHJvamVjdCAiICsgYXJ0aWZhY3RQcm9qZWN0ICsgIiBwYWNrYWdlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcnRpZmFjdFByb2plY3QuZ2V0UGFja2FnaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChhcnRpZmFjdFByb2plY3QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGFydGlmYWN0UHJvamVjdC5nZXRQYWNrYWdpbmcoKS5lcXVhbHMoImpiaS1jb21wb25lbnQiKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXJ0aWZhY3RJblNVUG9tLmdldEFydGlmYWN0SWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJUaGUgc2VydmljZSB1bml0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBoYXZlIGEgZGVwZW5kZW5jeSB3aGljaCBpcyBwYWNrYWdlZCBhcyBhIGpiaS1jb21wb25lbnQgb3IgYSBwcm9qZWN0IHByb3BlcnR5ICdjb21wb25lbnROYW1lJyIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlU2VydmljZUFzc2VtYmx5TW9qby5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlU2VydmljZUFzc2VtYmx5TW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJmYzZiLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9HZW5lcmF0ZVNlcnZpY2VBc3NlbWJseU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcmNoaXZlci5NYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5TY29wZUFydGlmYWN0RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuUGx1Z2luOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLkphckFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLk1hbmlmZXN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQSBNb2pvIHVzZWQgdG8gYnVpbGQgdGhlIGpiaSBzZXJ2aWNlIGFzc2VtYmx5IHppcCBmaWxlCi0gKgotICogQGdvYWwgamJpLXNlcnZpY2UtYXNzZW1ibHkKLSAqIEBwaGFzZSBwYWNrYWdlCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKiBAZGVzY3JpcHRpb24gaW5qZWN0cyBhZGRpdGlvbmFsIGxpYnJhcmllcyBpbnRvIHNlcnZpY2UgYXNzZW1ibHkKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlU2VydmljZUFzc2VtYmx5TW9qbyBleHRlbmRzIEFic3RyYWN0SmJpTW9qbyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgWmlwIGFyY2hpdmVyLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2NvbXBvbmVudC5vcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyI2phcn0iCi0gICAgICogQGNvbXBvbmVudCByb2xlPSJvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyIiByb2xlSGludD0iamFyIgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgSmFyQXJjaGl2ZXIgamFyQXJjaGl2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IGZvciB0aGUgZ2VuZXJhdGVkIEpCSSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHdhci4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0uemlwIgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZpbmFsTmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXZlbiBhcmNoaXZlIGNvbmZpZ3VyYXRpb24gdG8gdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBhcmNoaXZlID0gbmV3IE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24oKTsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5qZWN0RGVwZW5kZW50U2VydmljZVVuaXRzKCk7Ci0gICAgICAgICAgICBGaWxlIHNhID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBmaW5hbE5hbWUpOwotICAgICAgICAgICAgY3JlYXRlQXJjaGl2ZShzYSk7Ci0gICAgICAgICAgICBwcm9qZWN0LmdldEFydGlmYWN0KCkuc2V0RmlsZShzYSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGluamVjdCBkZXBlbmRlbmNpZXMiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBcmNoaXZlKEZpbGUgaW5zdGFsbGVyRmlsZSkgdGhyb3dzIEpiaVBsdWdpbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIHNlcnZpY2UgYXNzZW1ibHkgIiArIGluc3RhbGxlckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgTWF2ZW5BcmNoaXZlciBhcmNoaXZlciA9IG5ldyBNYXZlbkFyY2hpdmVyKCk7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXRBcmNoaXZlcihqYXJBcmNoaXZlcik7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXRPdXRwdXRGaWxlKGluc3RhbGxlckZpbGUpOwotICAgICAgICAgICAgTWFuaWZlc3QgbSA9IGNyZWF0ZU1hbmlmZXN0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IGdldFByb2plY3QoKS5nZXRBcnRpZmFjdCgpLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgIC8vIGFkZCBJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIGF0dHJpYnV0ZSBpbiB0aGUgTUFOSUZFU1QKLSAgICAgICAgICAgIG0uZ2V0TWFpblNlY3Rpb24oKS5hZGRDb25maWd1cmVkQXR0cmlidXRlKG5ldyBNYW5pZmVzdC5BdHRyaWJ1dGUoIkltcGxlbWVudGF0aW9uLVZlcnNpb24iLCB2ZXJzaW9uKSk7Ci0KLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIkFkZCBJbXBsZW1lbnRhdGlvbi1WZXJzaW9uOiAiICsgdmVyc2lvbik7Ci0KLSAgICAgICAgICAgIGphckFyY2hpdmVyLmFkZENvbmZpZ3VyZWRNYW5pZmVzdChtKTsKLQotICAgICAgICAgICAgRmlsZSBjbGFzc2VzRGlyID0gbmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJ1aWxkKCkuZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOwotICAgICAgICAgICAgaWYgKCBjbGFzc2VzRGlyLmV4aXN0cygpICkKLSAgICAgICAgICAgICAgICBqYXJBcmNoaXZlci5hZGREaXJlY3RvcnkoY2xhc3Nlc0RpciwgbnVsbCwgRGlyZWN0b3J5U2Nhbm5lci5ERUZBVUxURVhDTFVERVMpOwotCi0gICAgICAgICAgICBqYXJBcmNoaXZlci5hZGREaXJlY3Rvcnkod29ya0RpcmVjdG9yeSwgbnVsbCwgRGlyZWN0b3J5U2Nhbm5lci5ERUZBVUxURVhDTFVERVMpOwotICAgICAgICAgICAgYXJjaGl2ZXIuY3JlYXRlQXJjaGl2ZShnZXRQcm9qZWN0KCksIGFyY2hpdmUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpiaVBsdWdpbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgc2hhcmVkIGxpYnJhcnk6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5qZWN0RGVwZW5kZW50U2VydmljZVVuaXRzKCkgdGhyb3dzIEpiaVBsdWdpbkV4Y2VwdGlvbiwgQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uLCBBcnRpZmFjdE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0IGFydGlmYWN0cyA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IHV0aWxpc2UgYXBwcm9wcmlhdGUgbWV0aG9kcyBmcm9tIHByb2plY3QgYnVpbGRlcgotICAgICAgICAgICAgU2NvcGVBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgU2NvcGVBcnRpZmFjdEZpbHRlcihBcnRpZmFjdC5TQ09QRV9SVU5USU1FKTsKLSAgICAgICAgICAgIGlmICghYXJ0aWZhY3QuaXNPcHRpb25hbCgpICYmIGZpbHRlci5pbmNsdWRlKGFydGlmYWN0KSAmJiAoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeVRyYWlsKCkuc2l6ZSgpID09IDIpKSB7Ci0gICAgICAgICAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSBwcm9qZWN0QnVpbGRlci5idWlsZEZyb21SZXBvc2l0b3J5KGFydGlmYWN0LCByZW1vdGVSZXBvcywgbG9jYWxSZXBvKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQcm9qZWN0QnVpbGRpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHBhY2thZ2luZyBmb3IgZGVwZW5kZW5jeSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXNzdW1pbmcgamFyIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5nZXRQYWNrYWdpbmcoKS5lcXVhbHMoImpiaS1zZXJ2aWNlLXVuaXQiKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAJU3RyaW5nIHN1TmFtZSA9IGdldFNlcnZpY2VVbml0TmFtZShwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgCVN0cmluZyBwYXRoID0gYXJ0aWZhY3QuZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAJaWYgKHN1TmFtZSAhPSBudWxsICYmIHN1TmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikpICsgRmlsZS5zZXBhcmF0b3IgKyBzdU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIAl9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKCcuJykpICsgIi56aXAiOwotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAJRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkobmV3IEZpbGUocGF0aCksIHdvcmtEaXJlY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpUGx1Z2luRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlU2VydmljZVVuaXREZXNjcmlwdG9yTW9qby5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlU2VydmljZVVuaXREZXNjcmlwdG9yTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGUyMzAxLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9HZW5lcmF0ZVNlcnZpY2VVbml0RGVzY3JpcHRvck1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLlNjb3BlQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5QbHVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5Qcm9qZWN0QnVpbGRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmNvbW1vbi5wYWNrYWdpbmcuU2VydmljZVVuaXRBbmFseXplcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhwcDNEb207Ci0KLS8qKgotICogQSBNb2pvIHVzZWQgdG8gYnVpbGQgdGhlIGpiaS54bWwgZmlsZSBmb3IgYSBzZXJ2aWNlIHVuaXQuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0icGRvZGRzQGFwYWNoZS5vcmciPlBoaWxpcCBEb2RkczwvYT4KLSAqIEB2ZXJzaW9uICRJZDogR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qbyAzMTQ5NTYgMjAwNS0xMC0xMiAxNjoyNzoxNVoKLSAqICAgICAgICAgIGJyZXR0ICQKLSAqIEBnb2FsIGdlbmVyYXRlLWpiaS1zZXJ2aWNlLXVuaXQtZGVzY3JpcHRvcgotICogQHBoYXNlIHByb2Nlc3MtY2xhc3NlcwotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICogQGRlc2NyaXB0aW9uIGdlbmVyYXRlcyB0aGUgamJpLnhtbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIGEgc2VydmljZSB1bml0Ci0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVNlcnZpY2VVbml0RGVzY3JpcHRvck1vam8gZXh0ZW5kcyBBYnN0cmFjdEpiaU1vam8gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgamJpLnhtbCBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBCb29sZWFuIGdlbmVyYXRlSmJpRGVzY3JpcHRvciA9IEJvb2xlYW4uVFJVRTsKLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0byB1c2UgdGhlIHNlcnZpY2UgdW5pdCBhbmFseXplcgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEJvb2xlYW4gdXNlU2VydmljZVVuaXRBbmFseXplciA9IEJvb2xlYW4uVFJVRTsKLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyBhIHNlcnZpY2VVbml0QW5hbHl6ZXIgY2xhc3MgbmFtZSAob3B0aW9uYWwpCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VVbml0QW5hbHl6ZXJDbGFzczsKLQotICAgIC8qKgotICAgICAqIEZhaWwgaWYgdGhlIGRlc2NyaXB0b3IgZ2VuZXJhdGlvbiBmYWlscwotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEJvb2xlYW4gZmFpbE9uSmJpRGVzY3JpcHRvckZhaWx1cmUgPSBCb29sZWFuLkZBTFNFOwotCi0gICAgLyoqCi0gICAgICogU2luZ2xlIGRpcmVjdG9yeSBmb3IgZXh0cmEgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgSkJJIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2piaS1zZXJ2aWNlcy54bWwiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGpiaVNlcnZpY2VzRmlsZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb21wb25lbnQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5hcnRpZmFjdElkfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbXBvbmVudCBkZXNjcmlwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5uYW1lfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoYXJhY3RlciBlbmNvZGluZyBmb3IgdGhlIGF1dG8tZ2VuZXJhdGVkIGFwcGxpY2F0aW9uLnhtbCBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IFVURl84OwotCi0gICAgLyoqCi0gICAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBhcHBsaWNhdGlvbi54bWwgZmlsZSB3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlcy9NRVRBLUlORiIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZWREZXNjcmlwdG9yTG9jYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3Rvcnkgd2hlcmUgYXJ0aWZhY3RzIGZvciB0aGUgc2VydmljZSB1bml0IGFyZSBoZWxkCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcyIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgc2VydmljZVVuaXRBcnRpZmFjdHNEaXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLQotICAgICAgICBnZXRMb2coKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiID09PT09PT0gR2VuZXJhdGVTZXJ2aWNlVW5pdERlc2NyaXB0b3JNb2pvIHNldHRpbmdzID09PT09PT0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIndvcmtEaXJlY3RvcnlbIiArIHdvcmtEaXJlY3RvcnkgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiZ2VuZXJhdGVEZXNjcmlwdG9yWyIgKyBnZW5lcmF0ZUpiaURlc2NyaXB0b3IgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygibmFtZVsiICsgbmFtZSArICJdIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJkZXNjcmlwdGlvblsiICsgZGVzY3JpcHRpb24gKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiZW5jb2RpbmdbIiArIGVuY29kaW5nICsgIl0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgImdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvblsiICsgZ2VuZXJhdGVkRGVzY3JpcHRvckxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0KLSAgICAgICAgaWYgKCFnZW5lcmF0ZUpiaURlc2NyaXB0b3IuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW9uIG9mIGpiaS54bWwgaXMgZGlzYWJsZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdlbmVyYXRlIGpiaSBkZXNjcmlwdG9yIGFuZCBjb3B5IGl0IHRvIHRoZSBidWlsZCBkaXJlY3RvcnkKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBqYmkueG1sIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZW5lcmF0ZUpiaURlc2NyaXB0b3IoKTsKLSAgICAgICAgfSBjYXRjaCAoSmJpUGx1Z2luRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChmYWlsT25KYmlEZXNjcmlwdG9yRmFpbHVyZS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2VuZXJhdGUgamJpLnhtbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiRmFpbGVkIHRvIGdlbmVyYXRlIGpiaS54bWw6ICIgKyBlLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSmJpRGVzY3JpcHRvcigpIHRocm93cyBKYmlQbHVnaW5FeGNlcHRpb24gewotICAgICAgICBGaWxlIG91dHB1dERpciA9IG5ldyBGaWxlKGdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvbik7Ci0gICAgICAgIGlmICghb3V0cHV0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXRwdXREaXIubWtkaXJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzc0xvYWRlciBvbGQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkxDbGFzc0xvYWRlciBuZXdDbGFzc0xvYWRlciA9IGdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihuZXdDbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICBGaWxlIGRlc2NyaXB0b3IgPSBuZXcgRmlsZShvdXRwdXREaXIsIEpCSV9ERVNDUklQVE9SKTsKLSAgICAgICAgICAgIExpc3QgdXJpcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIEpiaVNlcnZpY2VVbml0RGVzY3JpcHRvcldyaXRlciB3cml0ZXIgPSBuZXcgSmJpU2VydmljZVVuaXREZXNjcmlwdG9yV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0KLSAgICAgICAgICAgIExpc3QgY29uc3VtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBMaXN0IHByb3ZpZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZVVuaXRBbmFseXplckNsYXp6TmFtZSA9IGdldFNlcnZpY2VVbml0QW5hbHl6ZXIoKTsKLSAgICAgICAgICAgIC8vIFRoZSBTZXJ2aWNlVW5pdEFuYWx5emVyIHNob3VsZCBnaXZlIHVzIHRoZSBjb25zdW1lcyBhbmQKLSAgICAgICAgICAgIC8vIHByb3ZpZGVzCi0gICAgICAgICAgICBpZiAoc2VydmljZVVuaXRBbmFseXplckNsYXp6TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZVVuaXRBbmFseXplciBzZXJ2aWNlVW5pdEFuYWx5emVyID0gKFNlcnZpY2VVbml0QW5hbHl6ZXIpIG5ld0NsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAubG9hZENsYXNzKHNlcnZpY2VVbml0QW5hbHl6ZXJDbGF6ek5hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGVkIFNlcnZpY2UgVW5pdCBBbmFseXplciAiICsgc2VydmljZVVuaXRBbmFseXplcik7Ci0gICAgICAgICAgICAgICAgc2VydmljZVVuaXRBbmFseXplci5pbml0KHNlcnZpY2VVbml0QXJ0aWZhY3RzRGlyKTsKLQotICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBkdW1teSBhbmFseXplcgotICAgICAgICAgICAgICAgIC8vIGlmIHNvIHdlIG5lZWQgdG8gZ2l2ZSBpdCB0aGUgc2VydmljZXMgZmlsZQotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlVW5pdEFuYWx5emVyIGluc3RhbmNlb2YgSmJpU2VydmljZUZpbGVBbmFseXplcikgewotICAgICAgICAgICAgICAgICAgICAoKEpiaVNlcnZpY2VGaWxlQW5hbHl6ZXIpIHNlcnZpY2VVbml0QW5hbHl6ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEpiaVNlcnZpY2VzRmlsZShqYmlTZXJ2aWNlc0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdW1lcy5hZGRBbGwoc2VydmljZVVuaXRBbmFseXplci5nZXRDb25zdW1lcygpKTsKLSAgICAgICAgICAgICAgICBwcm92aWRlcy5hZGRBbGwoc2VydmljZVVuaXRBbmFseXplci5nZXRQcm92aWRlcygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZCA6IGNvbnN1bWVzICIgKyBjb25zdW1lcyArICIgcHJvdmlkZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvdmlkZXMpOwotCi0gICAgICAgICAgICBib29sZWFuIGJjID0gZmFsc2U7Ci0gICAgICAgICAgICAvLyBUT0RPOiBmaW5kIGlmIHRoZSBjb21wb25lbnQgdGFyZ2V0IGlzIGEgQkMgPwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGRlc2NyaXB0b3IsIGJjLCBuYW1lLCBkZXNjcmlwdGlvbiwgdXJpcywgY29uc3VtZXMsCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2VuZXJhdGUgc2VydmljZSB1bml0IGRlc2NyaXB0b3IhIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvbGQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmljZVVuaXRBbmFseXplcigpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0byB3b3JrIG91dCBoZXJlIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBhIGR1bW15IHNlcnZpY2UgdW5pdAotICAgICAgICAvLyBhbmFseXplciB0aGF0IHdpbGwgZXhhbWluZSBhIGxvY2FsIHNlcnZpY2VzIGZpbGUgb3Igd2hldGhlcgotICAgICAgICAvLyB0byBsb29rIGZvciB0aGUgc2VydmljZSB1bml0IGFuYWx5emVyIGZyb20gdGhlIGNvbXBvbmVudAotICAgICAgICBpZiAoamJpU2VydmljZXNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSmJpU2VydmljZUZpbGVBbmFseXplci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVzZVNlcnZpY2VVbml0QW5hbHl6ZXIuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlVW5pdEFuYWx5emVyQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlVW5pdEFuYWx5emVyQ2xhc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IGdldENvbXBvbmVudFByb2plY3QoKTsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMaXN0IHBsdWdpbnMgPSBwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0UGx1Z2lucygpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgUGx1Z2luIHBsdWdpbiA9IChQbHVnaW4pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJvcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZyIuZXF1YWxzKHBsdWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRHcm91cElkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgImpiaS1tYXZlbi1wbHVnaW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHBsdWdpbi5nZXRBcnRpZmFjdElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIG8gPSAoWHBwM0RvbSkgcGx1Z2luLmdldENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgby5nZXRDaGlsZCgic2VydmljZVVuaXRBbmFseXplciIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhenpOYW1lID0gbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkKCJzZXJ2aWNlVW5pdEFuYWx5emVyIikuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IGdldENvbXBvbmVudFByb2plY3QoKSB7Ci0gICAgICAgIFNldCBhcnRpZmFjdHMgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IHV0aWxpc2UgYXBwcm9wcmlhdGUgbWV0aG9kcyBmcm9tIHByb2plY3QgYnVpbGRlcgotICAgICAgICAgICAgU2NvcGVBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgU2NvcGVBcnRpZmFjdEZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3QuU0NPUEVfUlVOVElNRSk7Ci0gICAgICAgICAgICBpZiAoIWFydGlmYWN0LmlzT3B0aW9uYWwoKSAmJiBmaWx0ZXIuaW5jbHVkZShhcnRpZmFjdCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGFydGlmYWN0LmdldERlcGVuZGVuY3lUcmFpbCgpLnNpemUoKSA9PSAyKSkgewotICAgICAgICAgICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gcHJvamVjdEJ1aWxkZXIuYnVpbGRGcm9tUmVwb3NpdG9yeShhcnRpZmFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVSZXBvcywgbG9jYWxSZXBvKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQcm9qZWN0QnVpbGRpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZXJtaW5lIHBhY2thZ2luZyBmb3IgZGVwZW5kZW5jeSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXNzdW1pbmcgamFyIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgocHJvamVjdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHByb2plY3QuZ2V0UGFja2FnaW5nKCkuZXF1YWxzKCJqYmktY29tcG9uZW50IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlU2VydmljZVVuaXRNb2pvLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvR2VuZXJhdGVTZXJ2aWNlVW5pdE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyYzdlMC4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvR2VuZXJhdGVTZXJ2aWNlVW5pdE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFyY2hpdmVyLk1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcmNoaXZlci5NYXZlbkFyY2hpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5BcnRpZmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuU2NvcGVBcnRpZmFjdEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0LlByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLkphckFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLk1hbmlmZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci0KLS8qKgotICogQSBNb2pvIHVzZWQgdG8gYnVpbGQgdGhlIGpiaSBzZXJ2aWNlIHVuaXQgemlwIGZpbGUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJwZG9kZHNAYXBhY2hlLm9yZyI+UGhpbGlwIERvZGRzPC9hPgotICogQHZlcnNpb24gJElkOiBHZW5lcmF0ZUFwcGxpY2F0aW9uWG1sTW9qby5qYXZhIDMxNDk1NiAyMDA1LTEwLTEyIDE2OjI3OjE1WgotICogICAgICAgICAgYnJldHQgJAotICogQGdvYWwgamJpLXNlcnZpY2UtdW5pdAotICogQHBoYXNlIHBhY2thZ2UKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqIEBkZXNjcmlwdGlvbiBpbmplY3RzIGFkZGl0aW9uYWwgbGlicmFyaWVzIGludG8gc2VydmljZSB1bml0Ci0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVNlcnZpY2VVbml0TW9qbyBleHRlbmRzIEFic3RyYWN0SmJpTW9qbyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHdhci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9LnppcCIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlVW5pdE5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IGZvciB0aGUgZ2VuZXJhdGVkIEpCSSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIFppcCBhcmNoaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7Y29tcG9uZW50Lm9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXIjamFyfSIKLSAgICAgKiBAY29tcG9uZW50IHJvbGU9Im9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXIiIHJvbGVIaW50PSJqYXIiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBKYXJBcmNoaXZlciBqYXJBcmNoaXZlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXZlbiBhcmNoaXZlIGNvbmZpZ3VyYXRpb24gdG8gdXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24gYXJjaGl2ZSA9IG5ldyBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIGFwcGxpY2F0aW9uLnhtbCBmaWxlIHdpbGwgYmUgYXV0by1nZW5lcmF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBzZXJ2aWNlVW5pdExvY2F0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEFydGlmYWN0SGFuZGxlciB0byBoYW5kbGUgamJpLXNlcnZpY2UtdW5pdCBhcnRpZmFjdHMKLSAgICAgKiAKLSAgICAgKiBAY29tcG9uZW50IHJvbGU9Im9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5BcnRpZmFjdEhhbmRsZXIiIHJvbGVIaW50PSJqYmktc2VydmljZS11bml0IgotICAgICAqLwotICAgIHByaXZhdGUgQXJ0aWZhY3RIYW5kbGVyIGhhbmRsZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCQotICAgICAgICAgICAgcHJvamVjdC5nZXRBcnRpZmFjdCgpLnNldEFydGlmYWN0SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIGNyZWF0ZVVucGFja2VkSW5zdGFsbGVyKCk7Ci0KLSAgICAgICAgICAgIEZpbGUgc2VydmljZVVuaXRGaWxlID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBzZXJ2aWNlVW5pdE5hbWUpOwotICAgICAgICAgICAgY3JlYXRlQXJjaGl2ZShzZXJ2aWNlVW5pdEZpbGUpOwotCi0gICAgICAgICAgICBwcm9qZWN0SGVscGVyLmF0dGFjaEFydGlmYWN0KHByb2plY3QsICJ6aXAiLCAiIiwgbmV3IEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeSwgc2VydmljZVVuaXROYW1lKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSmJpUGx1Z2luRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHNlcnZpY2UgdW5pdCIsIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQXJjaGl2ZShGaWxlIGluc3RhbGxlckZpbGUpIHRocm93cyBKYmlQbHVnaW5FeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBnZW5lcmF0ZSB3YXIgZmlsZQotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRpbmcgc2VydmljZSB1bml0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluc3RhbGxlckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgTWF2ZW5BcmNoaXZlciBhcmNoaXZlciA9IG5ldyBNYXZlbkFyY2hpdmVyKCk7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXRBcmNoaXZlcihqYXJBcmNoaXZlcik7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXRPdXRwdXRGaWxlKGluc3RhbGxlckZpbGUpOwotICAgICAgICAgICAgamFyQXJjaGl2ZXIuYWRkRGlyZWN0b3J5KHdvcmtEaXJlY3RvcnkpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYXJjaGl2ZQotICAgICAgICAgICAgYXJjaGl2ZXIuY3JlYXRlQXJjaGl2ZShnZXRQcm9qZWN0KCksIGFyY2hpdmUpOwotCi0gICAgICAgIH0gY2F0Y2ggKEFyY2hpdmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHNlcnZpY2UgdW5pdDogIgotICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoTWFuaWZlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpiaVBsdWdpbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgc2VydmljZSB1bml0OiAiCi0gICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmJpUGx1Z2luRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBzZXJ2aWNlIHVuaXQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpiaVBsdWdpbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgc2VydmljZSB1bml0OiAiCi0gICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVW5wYWNrZWRJbnN0YWxsZXIoKSB0aHJvd3MgSmJpUGx1Z2luRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIXdvcmtEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSAmJiAhd29ya0RpcmVjdG9yeS5ta2RpcnMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpiaVBsdWdpbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSB3b3JrIGRpcmVjdG9yeTogIiArIHdvcmtEaXJlY3RvcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RGlyZWN0b3J5U3RydWN0dXJlKHNlcnZpY2VVbml0TG9jYXRpb24sIHdvcmtEaXJlY3RvcnkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmJpUGx1Z2luRXhjZXB0aW9uKCJVbmFibGUgdG8gY29weSBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VVbml0TG9jYXRpb24sIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NvcGVBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgU2NvcGVBcnRpZmFjdEZpbHRlcigKLSAgICAgICAgICAgICAgICBBcnRpZmFjdC5TQ09QRV9SVU5USU1FKTsKLQotICAgICAgICBKYmlSZXNvbHV0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSByZXNvbHZlUHJvamVjdCgpOwotICAgICAgICAvLyBwcmludChsaXN0ZW5lci5nZXRSb290Tm9kZSgpLCAiIik7Ci0KLSAgICAgICAgU2V0IGluY2x1ZGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghYXJ0aWZhY3QuaXNPcHRpb25hbCgpICYmIGZpbHRlci5pbmNsdWRlKGFydGlmYWN0KSkgewotICAgICAgICAgICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJSZXNvbHZpbmcgIiArIGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gcHJvamVjdEJ1aWxkZXIuYnVpbGRGcm9tUmVwb3NpdG9yeShhcnRpZmFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVSZXBvcywgbG9jYWxSZXBvKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQcm9qZWN0QnVpbGRpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZXJtaW5lIHBhY2thZ2luZyBmb3IgZGVwZW5kZW5jeSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXNzdW1pbmcgamFyIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXRQYWNrYWdpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBhcnRpZmFjdC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCJqYmktY29tcG9uZW50Ii5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQnJhbmNoKGxpc3RlbmVyLCBhcnRpZmFjdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiamJpLXNoYXJlZC1saWJyYXJ5Ii5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQnJhbmNoKGxpc3RlbmVyLCBhcnRpZmFjdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMuYWRkKGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcHJpbnQobGlzdGVuZXIuZ2V0Um9vdE5vZGUoKSwgIiIpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJldGFpbkFydGlmYWN0cyhpbmNsdWRlcywgbGlzdGVuZXIpLml0ZXJhdG9yKCk7IGl0ZXIKLSAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJJbmNsdWRpbmc6ICIgKyBhcnRpZmFjdCk7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkoYXJ0aWZhY3QuZ2V0RmlsZSgpLCBuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtEaXJlY3RvcnksIExJQl9ESVJFQ1RPUlkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpUGx1Z2luRXhjZXB0aW9uKCJVbmFibGUgdG8gY29weSBmaWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0RmlsZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9HZW5lcmF0ZVNoYXJlZExpYnJhcnlEZXNjcmlwdG9yTW9qby5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlU2hhcmVkTGlicmFyeURlc2NyaXB0b3JNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOGJiMmQuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0dlbmVyYXRlU2hhcmVkTGlicmFyeURlc2NyaXB0b3JNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLlNjb3BlQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi0vKioKLSAqIEEgTW9qbyB1c2VkIHRvIGJ1aWxkIHRoZSBqYmkueG1sIGZpbGUgZm9yIGEgc2hhcmVkIGxpYnJhcnkKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJwZG9kZHNAYXBhY2hlLm9yZyI+UGhpbGlwIERvZGRzPC9hPgotICogQHZlcnNpb24gJElkOiBHZW5lcmF0ZUNvbXBvbmVudERlc2NyaXB0b3JNb2pvIDMxNDk1NiAyMDA1LTEwLTEyIDE2OjI3OjE1WgotICogICAgICAgICAgYnJldHQgJAotICogQGdvYWwgZ2VuZXJhdGUtamJpLXNoYXJlZC1saWJyYXJ5LWRlc2NyaXB0b3IKLSAqIEBwaGFzZSBnZW5lcmF0ZS1yZXNvdXJjZXMKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqIEBkZXNjcmlwdGlvbiBnZW5lcmF0ZXMgdGhlIGpiaS54bWwgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBhIHNoYXJlZCBsaWJyYXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVNoYXJlZExpYnJhcnlEZXNjcmlwdG9yTW9qbyBleHRlbmRzIEFic3RyYWN0SmJpTW9qbyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBqYmkueG1sIHNob3VsZCBiZSBnZW5lcmF0ZWQgb3Igbm90LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEJvb2xlYW4gZ2VuZXJhdGVKYmlEZXNjcmlwdG9yID0gQm9vbGVhbi5UUlVFOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNoYXJlZCBsaWJyYXJ5IG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYXJ0aWZhY3RJZH0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzaGFyZWQgbGlicmFyeSBkZXNjcmlwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5uYW1lfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LnZlcnNpb259IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2hhcmVkIGxpYnJhcnkgY2xhc3MgbG9hZGVyIGRlbGVnYXRpb24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InBhcmVudC1maXJzdCIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc0xvYWRlckRlbGVnYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBhcHBsaWNhdGlvbi54bWwgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBVVEZfODsKLQotICAgIC8qKgotICAgICAqIERpcmVjdG9yeSB3aGVyZSB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGUgd2lsbCBiZSBhdXRvLWdlbmVyYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotCi0gICAgICAgIGdldExvZygpCi0gICAgICAgICAgICAgICAgLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIiA9PT09PT09IEdlbmVyYXRlU2hhcmVkTGlicmFyeURlc2NyaXB0b3JNb2pvIHNldHRpbmdzID09PT09PT0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIndvcmtEaXJlY3RvcnlbIiArIHdvcmtEaXJlY3RvcnkgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiZ2VuZXJhdGVKYmlEZXNjcmlwdG9yWyIgKyBnZW5lcmF0ZUpiaURlc2NyaXB0b3IgKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygibmFtZVsiICsgbmFtZSArICJdIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJkZXNjcmlwdGlvblsiICsgZGVzY3JpcHRpb24gKyAiXSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiZW5jb2RpbmdbIiArIGVuY29kaW5nICsgIl0iKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgImdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvblsiICsgZ2VuZXJhdGVkRGVzY3JpcHRvckxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJ2ZXJzaW9uWyIgKyB2ZXJzaW9uICsgIl0iKTsKLQotICAgICAgICBpZiAoIWdlbmVyYXRlSmJpRGVzY3JpcHRvci5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkdlbmVyYXRpb24gb2YgamJpLnhtbCBpcyBkaXNhYmxlZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgamJpIGRlc2NyaXB0b3IgYW5kIGNvcHkgaXQgdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeQotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIGpiaS54bWwiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdlbmVyYXRlSmJpRGVzY3JpcHRvcigpOwotICAgICAgICB9IGNhdGNoIChKYmlQbHVnaW5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBnZW5lcmF0ZSBqYmkueG1sIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkobmV3IEZpbGUoZ2VuZXJhdGVkRGVzY3JpcHRvckxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICBKQklfREVTQ1JJUFRPUiksIG5ldyBGaWxlKGdldFdvcmtEaXJlY3RvcnkoKSwgTUVUQV9JTkYpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY29weSBqYmkueG1sIHRvIGZpbmFsIGRlc3RpbmF0aW9uIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVKYmlEZXNjcmlwdG9yKCkgdGhyb3dzIEpiaVBsdWdpbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgb3V0cHV0RGlyID0gbmV3IEZpbGUoZ2VuZXJhdGVkRGVzY3JpcHRvckxvY2F0aW9uKTsKLSAgICAgICAgaWYgKCFvdXRwdXREaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG91dHB1dERpci5ta2RpcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgZGVzY3JpcHRvciA9IG5ldyBGaWxlKG91dHB1dERpciwgSkJJX0RFU0NSSVBUT1IpOwotCi0gICAgICAgIExpc3QgZW1iZWRkZWRMaWJyYXJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgRGVwZW5kZW5jeUluZm9ybWF0aW9uIGluZm8gPSBuZXcgRGVwZW5kZW5jeUluZm9ybWF0aW9uKCk7Ci0gICAgICAgIGluZm8uc2V0RmlsZW5hbWUoTElCX0RJUkVDVE9SWSArICIvIiArIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi0iCi0gICAgICAgICAgICAgICAgKyBwcm9qZWN0LmdldFZlcnNpb24oKSArICIuamFyIik7Ci0gICAgICAgIGluZm8uc2V0VmVyc2lvbihwcm9qZWN0LmdldFZlcnNpb24oKSk7Ci0gICAgICAgIGluZm8uc2V0TmFtZShwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgIGluZm8uc2V0VHlwZSgiamFyIik7Ci0gICAgICAgIGVtYmVkZGVkTGlicmFyaWVzLmFkZChpbmZvKTsKLQotICAgICAgICBTZXQgYXJ0aWZhY3RzID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICAvLyBUT0RPOiB1dGlsaXNlIGFwcHJvcHJpYXRlIG1ldGhvZHMgZnJvbSBwcm9qZWN0IGJ1aWxkZXIKLSAgICAgICAgICAgIFNjb3BlQXJ0aWZhY3RGaWx0ZXIgZmlsdGVyID0gbmV3IFNjb3BlQXJ0aWZhY3RGaWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgIEFydGlmYWN0LlNDT1BFX1JVTlRJTUUpOwotICAgICAgICAgICAgaWYgKCFhcnRpZmFjdC5pc09wdGlvbmFsKCkgJiYgZmlsdGVyLmluY2x1ZGUoYXJ0aWZhY3QpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBhcnRpZmFjdC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCJqYXIiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBpbmZvID0gbmV3IERlcGVuZGVuY3lJbmZvcm1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLnNldEZpbGVuYW1lKExJQl9ESVJFQ1RPUlkgKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFydGlmYWN0LmdldEZpbGUoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZExpYnJhcmllcy5hZGQoaW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSmJpU2hhcmVkTGlicmFyeURlc2NyaXB0b3JXcml0ZXIgd3JpdGVyID0gbmV3IEpiaVNoYXJlZExpYnJhcnlEZXNjcmlwdG9yV3JpdGVyKAotICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKGRlc2NyaXB0b3IsIG5hbWUsIGRlc2NyaXB0aW9uLCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyRGVsZWdhdGlvbiwgZW1iZWRkZWRMaWJyYXJpZXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9HZW5lcmF0ZVNoYXJlZExpYnJhcnlNb2pvLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvR2VuZXJhdGVTaGFyZWRMaWJyYXJ5TW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY5OTFkLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9HZW5lcmF0ZVNoYXJlZExpYnJhcnlNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcmNoaXZlci5NYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLlNjb3BlQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmphci5KYXJBcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi0vKioKLSAqIEEgTW9qbyB1c2VkIHRvIGJ1aWxkIHRoZSBqYmkgc2hhcmVkIGxpYnJhcnkgemlwIGZpbGUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJwZG9kZHNAYXBhY2hlLm9yZyI+UGhpbGlwIERvZGRzPC9hPgotICogQHZlcnNpb24gJElkOiBHZW5lcmF0ZUFwcGxpY2F0aW9uWG1sTW9qby5qYXZhIDMxNDk1NiAyMDA1LTEwLTEyIDE2OjI3OjE1WgotICogICAgICAgICAgYnJldHQgJAotICogQGdvYWwgamJpLXNoYXJlZC1saWJyYXJ5Ci0gKiBAcGhhc2UgcGFja2FnZQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICogQGRlc2NyaXB0aW9uIGluamVjdHMgYWRkaXRpb25hbCBsaWJyYXJpZXMgaW50byBzaGFyZWQgbGlicmFyeQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVTaGFyZWRMaWJyYXJ5TW9qbyBleHRlbmRzIEFic3RyYWN0SmJpTW9qbyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IGZvciB0aGUgZ2VuZXJhdGVkIEpCSSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCB3YXIuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS56aXAiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2hhcmVkTGlicmFyeU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHdhci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9LmphciIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBqYXJOYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIFppcCBhcmNoaXZlci4KLSAgICAgKiAKLSAgICAgKiBAY29tcG9uZW50IHJvbGU9Im9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXIiIHJvbGVIaW50PSJqYXIiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBKYXJBcmNoaXZlciBqYXJBcmNoaXZlcjsKLQotICAgIC8qKgotICAgICAqIFNpbmdsZSBkaXJlY3RvcnkgZm9yIGV4dHJhIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIEpCSSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2Jhc2VkaXJ9L3NyYy9tYWluL2piaSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgamJpU291cmNlRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1hdmVuIGFyY2hpdmUgY29uZmlndXJhdGlvbiB0byB1c2UuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBhcmNoaXZlID0gbmV3IE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24oKTsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotCi0gICAgICAgIGdldExvZygpLmRlYnVnKCIgPT09PT09PSBHZW5lcmF0ZUluc3RhbGxlck1vam8gc2V0dGluZ3MgPT09PT09PSIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1Zygid29ya0RpcmVjdG9yeVsiICsgd29ya0RpcmVjdG9yeSArICJdIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJpbnN0YWxsZXJOYW1lWyIgKyBzaGFyZWRMaWJyYXJ5TmFtZSArICJdIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJqYmlTb3VyY2VEaXJlY3RvcnlbIiArIGpiaVNvdXJjZURpcmVjdG9yeSArICJdIik7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgY3JlYXRlVW5wYWNrZWRTaGFyZWRMaWJyYXJ5KCk7Ci0KLSAgICAgICAgICAgIEZpbGUgaW5zdGFsbGVyRmlsZSA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSwgc2hhcmVkTGlicmFyeU5hbWUpOwotICAgICAgICAgICAgY3JlYXRlQXJjaGl2ZShpbnN0YWxsZXJGaWxlKTsKLQotICAgICAgICAgICAgcHJvamVjdEhlbHBlci5hdHRhY2hBcnRpZmFjdChwcm9qZWN0LCAiamFyIiwgIiIsIG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXJlY3RvcnksIGphck5hbWUpKTsKLQotICAgICAgICAgICAgcHJvamVjdEhlbHBlci5hdHRhY2hBcnRpZmFjdChwcm9qZWN0LCAiemlwIiwgImluc3RhbGxlciIsIG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXJlY3RvcnksIHNoYXJlZExpYnJhcnlOYW1lKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSmJpUGx1Z2luRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHNoYXJlZCBsaWJyYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQXJjaGl2ZShGaWxlIGluc3RhbGxlckZpbGUpIHRocm93cyBKYmlQbHVnaW5FeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBnZW5lcmF0ZSB3YXIgZmlsZQotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRpbmcgc2hhcmVkIGxpYnJhcnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5zdGFsbGVyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBNYXZlbkFyY2hpdmVyIGFyY2hpdmVyID0gbmV3IE1hdmVuQXJjaGl2ZXIoKTsKLSAgICAgICAgICAgIGFyY2hpdmVyLnNldEFyY2hpdmVyKGphckFyY2hpdmVyKTsKLSAgICAgICAgICAgIGFyY2hpdmVyLnNldE91dHB1dEZpbGUoaW5zdGFsbGVyRmlsZSk7Ci0gICAgICAgICAgICBqYXJBcmNoaXZlci5hZGREaXJlY3Rvcnkod29ya0RpcmVjdG9yeSk7Ci0gICAgICAgICAgICBqYXJBcmNoaXZlci5hZGRDb25maWd1cmVkTWFuaWZlc3QoY3JlYXRlTWFuaWZlc3QoKSk7Ci0gICAgICAgICAgICBpZiAoamJpU291cmNlRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBqYXJBcmNoaXZlci5hZGREaXJlY3RvcnkoamJpU291cmNlRGlyZWN0b3J5LCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lci5ERUZBVUxURVhDTFVERVMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY3JlYXRlIGFyY2hpdmUKLSAgICAgICAgICAgIGFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUoZ2V0UHJvamVjdCgpLCBhcmNoaXZlKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpiaVBsdWdpbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgc2hhcmVkIGxpYnJhcnk6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVW5wYWNrZWRTaGFyZWRMaWJyYXJ5KCkgdGhyb3dzIEpiaVBsdWdpbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCF3b3JrRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkgJiYgIXdvcmtEaXJlY3RvcnkubWtkaXJzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgd29yayBkaXJlY3Rvcnk6ICIgKyB3b3JrRGlyZWN0b3J5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgcHJvamVjdEFydGlmYWN0ID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgLmdldEFydGlmYWN0SWQoKQotICAgICAgICAgICAgICAgICsgIi0iICsgcHJvamVjdC5nZXRWZXJzaW9uKCkgKyAiLmphciIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkocHJvamVjdEFydGlmYWN0LCBuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgd29ya0RpcmVjdG9yeSwgTElCX0RJUkVDVE9SWSkpOwotCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIlVuYWJsZSB0byBjb3B5IGZpbGUgIgotICAgICAgICAgICAgICAgICAgICArIHByb2plY3RBcnRpZmFjdCwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQgYXJ0aWZhY3RzID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICAvLyBUT0RPOiB1dGlsaXNlIGFwcHJvcHJpYXRlIG1ldGhvZHMgZnJvbSBwcm9qZWN0IGJ1aWxkZXIKLSAgICAgICAgICAgIFNjb3BlQXJ0aWZhY3RGaWx0ZXIgZmlsdGVyID0gbmV3IFNjb3BlQXJ0aWZhY3RGaWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgIEFydGlmYWN0LlNDT1BFX1JVTlRJTUUpOwotICAgICAgICAgICAgaWYgKCFhcnRpZmFjdC5pc09wdGlvbmFsKCkgJiYgZmlsdGVyLmluY2x1ZGUoYXJ0aWZhY3QpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBhcnRpZmFjdC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCJqYXIiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkoYXJ0aWZhY3QuZ2V0RmlsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSh3b3JrRGlyZWN0b3J5LCBMSUJfRElSRUNUT1JZKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIlVuYWJsZSB0byBjb3B5IGZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFydGlmYWN0LmdldEZpbGUoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9Jc0RlcGxveWVkVGFzay5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0lzRGVwbG95ZWRUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTBmNTQuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0lzRGVwbG95ZWRUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5mcmFtZXdvcmsuQWRtaW5Db21tYW5kc1NlcnZpY2VNQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLm1hbmFnZW1lbnQudGFzay5KYmlUYXNrOwotCi1wdWJsaWMgY2xhc3MgSXNEZXBsb3llZFRhc2sgZXh0ZW5kcyBKYmlUYXNrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQklfU0hBUkVEX0xJQlJBUlkgPSAiamJpLXNoYXJlZC1saWJyYXJ5IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQklfQ09NUE9ORU5UID0gImpiaS1jb21wb25lbnQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpCSV9TRVJWSUNFX0FTU0VNQkxZID0gImpiaS1zZXJ2aWNlLWFzc2VtYmx5IjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBkZXBsb3llZDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXBsb3llZCgpIHsKLSAgICAgICAgcmV0dXJuIGRlcGxveWVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlcGxveWVkKGJvb2xlYW4gZGVwbG95ZWQpIHsKLSAgICAgICAgdGhpcy5kZXBsb3llZCA9IGRlcGxveWVkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZShBZG1pbkNvbW1hbmRzU2VydmljZU1CZWFuIGFjcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChKQklfU0hBUkVEX0xJQlJBUlkuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYWNzLmxpc3RTaGFyZWRMaWJyYXJpZXMobnVsbCwgbmFtZSk7Ci0gICAgICAgICAgICBzZXREZXBsb3llZChpc1Jlc3VsdENvbnRhaW5pbmcocmVzdWx0LCAic2hhcmVkLWxpYnJhcnkiLCBuYW1lKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoSkJJX1NFUlZJQ0VfQVNTRU1CTFkuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYWNzLmxpc3RTZXJ2aWNlQXNzZW1ibGllcyhudWxsLCBudWxsLCBuYW1lKTsKLSAgICAgICAgICAgIHNldERlcGxveWVkKHJlc3VsdC5jb250YWlucygiPHNlcnZpY2UtYXNzZW1ibHktaW5mbyBuYW1lPSciICsgbmFtZQotICAgICAgICAgICAgICAgICAgICArICInIikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChKQklfQ09NUE9ORU5ULmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGFjcy5saXN0Q29tcG9uZW50cyhmYWxzZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGlmIChpc1Jlc3VsdENvbnRhaW5pbmcocmVzdWx0LCAic2VydmljZS1lbmdpbmUiLCBuYW1lKQotICAgICAgICAgICAgICAgICAgICB8fCBpc1Jlc3VsdENvbnRhaW5pbmcocmVzdWx0LCAiYmluZGluZy1jb21wb25lbnQiLCBuYW1lKSkgewotICAgICAgICAgICAgICAgIHNldERlcGxveWVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVzdWx0Q29udGFpbmluZyhTdHJpbmcgcmVzdWx0LCBTdHJpbmcgdCwgU3RyaW5nIG4pIHsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudExpbmUgPSAiPGNvbXBvbmVudC1pbmZvIHR5cGU9JyIgKyB0ICsgIicgbmFtZT0nIiArIG4gKyAiJyI7Ci0gICAgICAgIHJldHVybiByZXN1bHQuY29udGFpbnMoY29tcG9uZW50TGluZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlDb21wb25lbnREZXNjcmlwdG9yV3JpdGVyLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvSmJpQ29tcG9uZW50RGVzY3JpcHRvcldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmZiNTZjLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlDb21wb25lbnREZXNjcmlwdG9yV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5QcmV0dHlQcmludFhNTFdyaXRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhNTFdyaXRlcjsKLQotcHVibGljIGNsYXNzIEpiaUNvbXBvbmVudERlc2NyaXB0b3JXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZW5jb2Rpbmc7Ci0KLSAgICBwdWJsaWMgSmJpQ29tcG9uZW50RGVzY3JpcHRvcldyaXRlcihTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKEZpbGUgZGVzY3JpcHRvciwgCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJvb3RzdHJhcCwKLSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3NMb2FkZXJEZWxlZ2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBib290c3RyYXBDbGFzc0xvYWRlckRlbGVnYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgIExpc3QgdXJpcykgdGhyb3dzIEpiaVBsdWdpbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFByaW50V3JpdGVyIHc7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3ID0gbmV3IFByaW50V3JpdGVyKGRlc2NyaXB0b3IsIGVuY29kaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBvcGVuaW5nIGZpbGVbIgotICAgICAgICAgICAgICAgICAgICArIGRlc2NyaXB0b3IuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIsIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFdyaXRlciB3cml0ZXIgPSBuZXcgUHJldHR5UHJpbnRYTUxXcml0ZXIodywgZW5jb2RpbmcsIG51bGwpOwotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJqYmkiKTsKLSAgICAgICAgd3JpdGVyLmFkZEF0dHJpYnV0ZSgieG1sbnMiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamJpIik7Ci0gICAgICAgIHdyaXRlci5hZGRBdHRyaWJ1dGUoInZlcnNpb24iLCAiMS4wIik7Ci0KLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgiY29tcG9uZW50Iik7Ci0gICAgICAgIHdyaXRlci5hZGRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLSAgICAgICAgd3JpdGVyLmFkZEF0dHJpYnV0ZSgiY29tcG9uZW50LWNsYXNzLWxvYWRlci1kZWxlZ2F0aW9uIiwKLSAgICAgICAgICAgICAgICBjb21wb25lbnRDbGFzc0xvYWRlckRlbGVnYXRpb24pOwotICAgICAgICB3cml0ZXIuYWRkQXR0cmlidXRlKCJib290c3RyYXAtY2xhc3MtbG9hZGVyLWRlbGVnYXRpb24iLAotICAgICAgICAgICAgICAgIGJvb3RzdHJhcENsYXNzTG9hZGVyRGVsZWdhdGlvbik7Ci0KLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgiaWRlbnRpZmljYXRpb24iKTsKLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgibmFtZSIpOwotICAgICAgICB3cml0ZXIud3JpdGVUZXh0KG5hbWUpOwotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotICAgICAgICB3cml0ZXIud3JpdGVUZXh0KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLQotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJjb21wb25lbnQtY2xhc3MtbmFtZSIpOwotICAgICAgICB3cml0ZXIud3JpdGVUZXh0KGNvbXBvbmVudCk7Ci0gICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoImNvbXBvbmVudC1jbGFzcy1wYXRoIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB1cmlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIERlcGVuZGVuY3lJbmZvcm1hdGlvbiBpbmZvID0gKERlcGVuZGVuY3lJbmZvcm1hdGlvbikgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFpbmZvLmlzU2hhcmVkTGlicmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgicGF0aC1lbGVtZW50Iik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlVGV4dChpbmZvLmdldEZpbGVuYW1lKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLQotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJib290c3RyYXAtY2xhc3MtbmFtZSIpOwotICAgICAgICB3cml0ZXIud3JpdGVUZXh0KGJvb3RzdHJhcCk7Ci0gICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoImJvb3RzdHJhcC1jbGFzcy1wYXRoIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB1cmlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIERlcGVuZGVuY3lJbmZvcm1hdGlvbiBpbmZvID0gKERlcGVuZGVuY3lJbmZvcm1hdGlvbikgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKCJqYXIiLmVxdWFscyhpbmZvLmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJwYXRoLWVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVUZXh0KGluZm8uZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB1cmlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIERlcGVuZGVuY3lJbmZvcm1hdGlvbiBpbmZvID0gKERlcGVuZGVuY3lJbmZvcm1hdGlvbikgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKGluZm8uaXNTaGFyZWRMaWJyYXJ5KCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJzaGFyZWQtbGlicmFyeSIpOwotICAgICAgICAgICAgICAgIHdyaXRlci5hZGRBdHRyaWJ1dGUoInZlcnNpb24iLCBpbmZvLmdldFZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlVGV4dChpbmZvLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLQotICAgICAgICBjbG9zZSh3KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xvc2UoV3JpdGVyIGNsb3NlYWJsZSkgewotICAgICAgICBpZiAoY2xvc2VhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xvc2VhYmxlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVBsdWdpbkV4Y2VwdGlvbi5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVBsdWdpbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGUzZWYzLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlQbHVnaW5FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmk7Ci0KLXB1YmxpYyBjbGFzcyBKYmlQbHVnaW5FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHVibGljIEpiaVBsdWdpbkV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmJpUGx1Z2luRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBKYmlQbHVnaW5FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEpiaVBsdWdpbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVByb2plY3REZXBsb3llck1vam8uamF2YSBiL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlQcm9qZWN0RGVwbG95ZXJNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjhhYmUuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVByb2plY3REZXBsb3llck1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLkRlcGxveVNlcnZpY2VBc3NlbWJseVRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suSW5zdGFsbENvbXBvbmVudFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suSW5zdGFsbFNoYXJlZExpYnJhcnlUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLlNodXREb3duQ29tcG9uZW50VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLm1hbmFnZW1lbnQudGFzay5TaHV0RG93blNlcnZpY2VBc3NlbWJseVRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suU3RhcnRDb21wb25lbnRUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLlN0YXJ0U2VydmljZUFzc2VtYmx5VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLm1hbmFnZW1lbnQudGFzay5TdG9wQ29tcG9uZW50VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLm1hbmFnZW1lbnQudGFzay5TdG9wU2VydmljZUFzc2VtYmx5VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLm1hbmFnZW1lbnQudGFzay5VbmRlcGxveVNlcnZpY2VBc3NlbWJseVRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suVW5pbnN0YWxsQ29tcG9uZW50VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLm1hbmFnZW1lbnQudGFzay5Vbmluc3RhbGxTaGFyZWRMaWJyYXJ5VGFzazsKLQotLyoqCi0gKiBBIE1vam8gdGhhdCBjYW4gdGFrZSBhbnkgcHJvamVjdCBhbmQgZGV0ZXJtaW5lIGl0cyBKQkkgZGVwZW5kZW5jaWVzIGFuZCB0aGVuCi0gKiBpbnN0YWxsIGl0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIHVzaW5nIHRoZSBKQkkgZGVwbG95bWVudCB0YXNrcwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9InBkb2Rkc0BhcGFjaGUub3JnIj5QaGlsaXAgRG9kZHM8L2E+Ci0gKiBAdmVyc2lvbiAkSWQ6IEdlbmVyYXRlQ29tcG9uZW50RGVzY3JpcHRvck1vam8gMzE0OTU2IDIwMDUtMTAtMTIgMTY6Mjc6MTVaCi0gKiAgICAgICAgICBicmV0dCAkCi0gKiBAZ29hbCBwcm9qZWN0RGVwbG95Ci0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKiBAZGVzY3JpcHRpb24gU3RhcnRzIGEgU2VydmljZU1peCBpbnN0YW5jZSBhbmQgaW5zdGFsbHMgdGhlIHByb2plY3QgKGFuZCBhbGwKLSAqICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMpIHRvIGl0Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYmlQcm9qZWN0RGVwbG95ZXJNb2pvIGV4dGVuZHMgQWJzdHJhY3REZXBsb3lhYmxlTW9qbyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQklfU0hBUkVEX0xJQlJBUlkgPSAiamJpLXNoYXJlZC1saWJyYXJ5IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpCSV9DT01QT05FTlQgPSAiamJpLWNvbXBvbmVudCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQklfU0VSVklDRV9BU1NFTUJMWSA9ICJqYmktc2VydmljZS1hc3NlbWJseSI7Ci0KLSAgICBwcml2YXRlIExpc3QgZGVwbG95bWVudFR5cGVzOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ0cnVlIiBleHByZXNzaW9uPSIke2RlcGxveURlcGVuZGVuY2llc30iCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlcGxveURlcGVuZGVuY2llczsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiIGV4cHJlc3Npb249IiR7Zm9yY2VVcGRhdGV9IgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZVVwZGF0ZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIgZXhwcmVzc2lvbj0iJHtkZWZlckV4Y2VwdGlvbnN9IgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWZlckV4Y2VwdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InRydWUiIGV4cHJlc3Npb249IiR7ZGVwbG95Q2hpbGRyZW59IgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkZXBsb3lDaGlsZHJlbjsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBkZXBsb3lQcm9qZWN0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVwbG95UHJvamVjdCgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFkZXBsb3lDaGlsZHJlbgotICAgICAgICAgICAgICAgICYmICFnZXREZXBsb3lhYmxlUGFja2FnaW5nVHlwZXMoKS5jb250YWlucygKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0UGFja2FnaW5nKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlByb2plY3QgbXVzdCBiZSBvZiBwYWNrYWdpbmcgdHlwZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RGVwbG95YWJsZVBhY2thZ2luZ1R5cGVzKCkgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0YWNrIGRlcGVuZGVuY2llcyA9IG5ldyBTdGFjaygpOwotICAgICAgICAgICAgaWYgKGRlcGxveUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZUFydGlmYWN0KHByb2plY3QuZ2V0QXJ0aWZhY3QoKSwgZGVwZW5kZW5jaWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChyZXNvbHZlRGVwbG95bWVudFBhY2thZ2UocHJvamVjdCwgcHJvamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFydGlmYWN0KCkpKTsKLSAgICAgICAgICAgICAgICBMaXN0IGFydGlmYWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdExpc3QuYWRkQWxsKHByb2plY3QuZ2V0QXJ0aWZhY3RzKCkpOwotICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYXJ0aWZhY3RMaXN0LCBuZXcgQXJ0aWZhY3REZXB0aENvbXBhcmF0b3IoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVBcnRpZmFjdChhcnRpZmFjdCwgZGVwZW5kZW5jaWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGdldExvZygpCi0gICAgICAgICAgICAgICAgICAgIC5pbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0gRGVwbG95bWVudCBBbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXROYW1lKCkgKyAiIGhhcyAiICsgKGRlcGVuZGVuY2llcy5zaXplKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjaGlsZCBkZXBlbmRlbmNpZXMiKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlcGVuZGVuY2llcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIiAtICIgKyBpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBnZXRMb2coKQotICAgICAgICAgICAgICAgICAgICAuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICAgICAgaWYgKGRlcGxveURlcGVuZGVuY2llcykgewotICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc3RvcCBhbGwgdGhlIGRlcGVuZGVuY2llcyBmaXJzdAotICAgICAgICAgICAgICAgIGlmICghZGVmZXJFeGNlcHRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgSmJpRGVwbG95YWJsZUFydGlmYWN0IGpiaURlcGxveWFibGUgPSAoSmJpRGVwbG95YWJsZUFydGlmYWN0KSBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2VVcGRhdGUgJiYgaXNEZXBsb3llZChqYmlEZXBsb3lhYmxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BEZXBlbmRlbmN5KGpiaURlcGxveWFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVwbG95RGVwZW5kZW5jeShqYmlEZXBsb3lhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjYW4gd2FsayB0aGUgZGVwZW5kZW5jaWVzIGJvdHRvbSB1cCAtIHJlLWRlcGxveWluZyBhbmQKLSAgICAgICAgICAgICAgICAvLyBzdGFydGluZyB0aGVtCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFkZXBlbmRlbmNpZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBKYmlEZXBsb3lhYmxlQXJ0aWZhY3QgamJpRGVwbG95YWJsZSA9IChKYmlEZXBsb3lhYmxlQXJ0aWZhY3QpIGRlcGVuZGVuY2llcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlVXBkYXRlIHx8ICFpc0RlcGxveWVkKGpiaURlcGxveWFibGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3lEZXBlbmRlbmN5KGpiaURlcGxveWFibGUsIGRlZmVyRXhjZXB0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmVyRXhjZXB0aW9ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGVwZW5kZW5jeShqYmlEZXBsb3lhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSmJpRGVwbG95YWJsZUFydGlmYWN0IGpiaURlcGxveWFibGUgPSAoSmJpRGVwbG95YWJsZUFydGlmYWN0KSBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNEZXBsb3llZChqYmlEZXBsb3lhYmxlKSkgewotICAgICAgICAgICAgICAgICAgICBzdG9wRGVwZW5kZW5jeShqYmlEZXBsb3lhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXBsb3lEZXBlbmRlbmN5KGpiaURlcGxveWFibGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXBsb3lEZXBlbmRlbmN5KGpiaURlcGxveWFibGUsIGRlZmVyRXhjZXB0aW9ucyk7Ci0gICAgICAgICAgICAgICAgc3RhcnREZXBlbmRlbmN5KGpiaURlcGxveWFibGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGRlcGxveSBwcm9qZWN0LCAiCi0gICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydERlcGVuZGVuY3koSmJpRGVwbG95YWJsZUFydGlmYWN0IGpiaURlcGxveWFibGUpIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiU3RhcnRpbmcgIiArIGpiaURlcGxveWFibGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKEpCSV9TRVJWSUNFX0FTU0VNQkxZLmVxdWFscyhqYmlEZXBsb3lhYmxlLmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgIFN0YXJ0U2VydmljZUFzc2VtYmx5VGFzayBzdGFydFRhc2sgPSBuZXcgU3RhcnRTZXJ2aWNlQXNzZW1ibHlUYXNrKCk7Ci0gICAgICAgICAgICBpbml0aWFsaXplSmJpVGFzayhzdGFydFRhc2spOwotICAgICAgICAgICAgc3RhcnRUYXNrLnNldE5hbWUoamJpRGVwbG95YWJsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc3RhcnRUYXNrLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoSkJJX0NPTVBPTkVOVC5lcXVhbHMoamJpRGVwbG95YWJsZS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICBTdGFydENvbXBvbmVudFRhc2sgc3RhcnRUYXNrID0gbmV3IFN0YXJ0Q29tcG9uZW50VGFzaygpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUpiaVRhc2soc3RhcnRUYXNrKTsKLSAgICAgICAgICAgIHN0YXJ0VGFzay5zZXROYW1lKGpiaURlcGxveWFibGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0YXJ0VGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1bmRlcGxveURlcGVuZGVuY3koSmJpRGVwbG95YWJsZUFydGlmYWN0IGpiaURlcGxveWFibGUpIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiVW5kZXBsb3lpbmcgIiArIGpiaURlcGxveWFibGUuZ2V0RmlsZSgpKTsKLSAgICAgICAgaWYgKEpCSV9TSEFSRURfTElCUkFSWS5lcXVhbHMoamJpRGVwbG95YWJsZS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICBVbmluc3RhbGxTaGFyZWRMaWJyYXJ5VGFzayBzaGFyZWRMaWJyYXJ5VGFzayA9IG5ldyBVbmluc3RhbGxTaGFyZWRMaWJyYXJ5VGFzaygpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUpiaVRhc2soc2hhcmVkTGlicmFyeVRhc2spOwotICAgICAgICAgICAgc2hhcmVkTGlicmFyeVRhc2suc2V0TmFtZShqYmlEZXBsb3lhYmxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzaGFyZWRMaWJyYXJ5VGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoSkJJX1NFUlZJQ0VfQVNTRU1CTFkuZXF1YWxzKGpiaURlcGxveWFibGUuZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgVW5kZXBsb3lTZXJ2aWNlQXNzZW1ibHlUYXNrIHNlcnZpY2VBc3NlbWJseVRhc2sgPSBuZXcgVW5kZXBsb3lTZXJ2aWNlQXNzZW1ibHlUYXNrKCk7Ci0gICAgICAgICAgICBpbml0aWFsaXplSmJpVGFzayhzZXJ2aWNlQXNzZW1ibHlUYXNrKTsKLSAgICAgICAgICAgIHNlcnZpY2VBc3NlbWJseVRhc2suc2V0TmFtZShqYmlEZXBsb3lhYmxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzZXJ2aWNlQXNzZW1ibHlUYXNrLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoSkJJX0NPTVBPTkVOVC5lcXVhbHMoamJpRGVwbG95YWJsZS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICBVbmluc3RhbGxDb21wb25lbnRUYXNrIGNvbXBvbmVudFRhc2sgPSBuZXcgVW5pbnN0YWxsQ29tcG9uZW50VGFzaygpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUpiaVRhc2soY29tcG9uZW50VGFzayk7Ci0gICAgICAgICAgICBjb21wb25lbnRUYXNrLnNldE5hbWUoamJpRGVwbG95YWJsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgY29tcG9uZW50VGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlcGxveWVkKEpiaURlcGxveWFibGVBcnRpZmFjdCBqYmlEZXBsb3lhYmxlKSB7Ci0gICAgICAgIElzRGVwbG95ZWRUYXNrIGlzRGVwbG95ZWRUYXNrID0gbmV3IElzRGVwbG95ZWRUYXNrKCk7Ci0gICAgICAgIGlzRGVwbG95ZWRUYXNrLnNldFR5cGUoamJpRGVwbG95YWJsZS5nZXRUeXBlKCkpOwotICAgICAgICBpc0RlcGxveWVkVGFzay5zZXROYW1lKGpiaURlcGxveWFibGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgaW5pdGlhbGl6ZUpiaVRhc2soaXNEZXBsb3llZFRhc2spOwotICAgICAgICBpc0RlcGxveWVkVGFzay5leGVjdXRlKCk7Ci0gICAgICAgIGJvb2xlYW4gZGVwbG95ZWQgPSBpc0RlcGxveWVkVGFzay5pc0RlcGxveWVkKCk7Ci0gICAgICAgIGlmIChkZXBsb3llZCkgewotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbyhqYmlEZXBsb3lhYmxlLmdldE5hbWUoKSArICIgaXMgZGVwbG95ZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oamJpRGVwbG95YWJsZS5nZXROYW1lKCkgKyAiIGlzIG5vdCBkZXBsb3llZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXBsb3llZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdG9wRGVwZW5kZW5jeShKYmlEZXBsb3lhYmxlQXJ0aWZhY3QgamJpRGVwbG95YWJsZSkgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJTdG9wcGluZyAiICsgamJpRGVwbG95YWJsZS5nZXROYW1lKCkpOwotICAgICAgICBpZiAoSkJJX1NFUlZJQ0VfQVNTRU1CTFkuZXF1YWxzKGpiaURlcGxveWFibGUuZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgU3RvcFNlcnZpY2VBc3NlbWJseVRhc2sgc3RvcFRhc2sgPSBuZXcgU3RvcFNlcnZpY2VBc3NlbWJseVRhc2soKTsKLSAgICAgICAgICAgIGluaXRpYWxpemVKYmlUYXNrKHN0b3BUYXNrKTsKLSAgICAgICAgICAgIHN0b3BUYXNrLnNldE5hbWUoamJpRGVwbG95YWJsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc3RvcFRhc2suZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICBTaHV0RG93blNlcnZpY2VBc3NlbWJseVRhc2sgc2h1dGRvd25UYXNrID0gbmV3IFNodXREb3duU2VydmljZUFzc2VtYmx5VGFzaygpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUpiaVRhc2soc2h1dGRvd25UYXNrKTsKLSAgICAgICAgICAgIHNodXRkb3duVGFzay5zZXROYW1lKGpiaURlcGxveWFibGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHNodXRkb3duVGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEpCSV9DT01QT05FTlQuZXF1YWxzKGpiaURlcGxveWFibGUuZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgU3RvcENvbXBvbmVudFRhc2sgc3RvcFRhc2sgPSBuZXcgU3RvcENvbXBvbmVudFRhc2soKTsKLSAgICAgICAgICAgIGluaXRpYWxpemVKYmlUYXNrKHN0b3BUYXNrKTsKLSAgICAgICAgICAgIHN0b3BUYXNrLnNldE5hbWUoamJpRGVwbG95YWJsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc3RvcFRhc2suZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICBTaHV0RG93bkNvbXBvbmVudFRhc2sgc2h1dGRvd25UYXNrID0gbmV3IFNodXREb3duQ29tcG9uZW50VGFzaygpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUpiaVRhc2soc2h1dGRvd25UYXNrKTsKLSAgICAgICAgICAgIHNodXRkb3duVGFzay5zZXROYW1lKGpiaURlcGxveWFibGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHNodXRkb3duVGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lEZXBlbmRlbmN5KEpiaURlcGxveWFibGVBcnRpZmFjdCBqYmlEZXBsb3lhYmxlLAotICAgICAgICAgICAgYm9vbGVhbiBkb0RlZmVyRXhjZXB0aW9ucykgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGdldExvZygpLmluZm8oCi0gICAgICAgICAgICAgICAgIkRlcGxveWluZyAiICsgamJpRGVwbG95YWJsZS5nZXRUeXBlKCkgKyAiIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBqYmlEZXBsb3lhYmxlLmdldEZpbGUoKSk7Ci0gICAgICAgIGlmIChKQklfU0hBUkVEX0xJQlJBUlkuZXF1YWxzKGpiaURlcGxveWFibGUuZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgSW5zdGFsbFNoYXJlZExpYnJhcnlUYXNrIGNvbXBvbmVudFRhc2sgPSBuZXcgSW5zdGFsbFNoYXJlZExpYnJhcnlUYXNrKCk7Ci0gICAgICAgICAgICBpbml0aWFsaXplSmJpVGFzayhjb21wb25lbnRUYXNrKTsKLSAgICAgICAgICAgIGNvbXBvbmVudFRhc2suc2V0RmlsZShqYmlEZXBsb3lhYmxlLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICBjb21wb25lbnRUYXNrLnNldERlZmVyRXhjZXB0aW9ucyhkb0RlZmVyRXhjZXB0aW9ucyk7Ci0gICAgICAgICAgICBjb21wb25lbnRUYXNrLmV4ZWN1dGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChKQklfU0VSVklDRV9BU1NFTUJMWS5lcXVhbHMoamJpRGVwbG95YWJsZS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICBEZXBsb3lTZXJ2aWNlQXNzZW1ibHlUYXNrIGNvbXBvbmVudFRhc2sgPSBuZXcgRGVwbG95U2VydmljZUFzc2VtYmx5VGFzaygpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUpiaVRhc2soY29tcG9uZW50VGFzayk7Ci0gICAgICAgICAgICBjb21wb25lbnRUYXNrLnNldEZpbGUoamJpRGVwbG95YWJsZS5nZXRGaWxlKCkpOwotICAgICAgICAgICAgY29tcG9uZW50VGFzay5zZXREZWZlckV4Y2VwdGlvbnMoZG9EZWZlckV4Y2VwdGlvbnMpOwotICAgICAgICAgICAgY29tcG9uZW50VGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEpCSV9DT01QT05FTlQuZXF1YWxzKGpiaURlcGxveWFibGUuZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgSW5zdGFsbENvbXBvbmVudFRhc2sgY29tcG9uZW50VGFzayA9IG5ldyBJbnN0YWxsQ29tcG9uZW50VGFzaygpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUpiaVRhc2soY29tcG9uZW50VGFzayk7Ci0gICAgICAgICAgICBjb21wb25lbnRUYXNrLnNldEZpbGUoamJpRGVwbG95YWJsZS5nZXRGaWxlKCkpOwotICAgICAgICAgICAgY29tcG9uZW50VGFzay5zZXREZWZlckV4Y2VwdGlvbnMoZG9EZWZlckV4Y2VwdGlvbnMpOwotICAgICAgICAgICAgY29tcG9uZW50VGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldERlcGxveWFibGVQYWNrYWdpbmdUeXBlcygpIHsKLSAgICAgICAgaWYgKGRlcGxveW1lbnRUeXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXBsb3ltZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBkZXBsb3ltZW50VHlwZXMuYWRkKEpCSV9TSEFSRURfTElCUkFSWSk7Ci0gICAgICAgICAgICBkZXBsb3ltZW50VHlwZXMuYWRkKEpCSV9TRVJWSUNFX0FTU0VNQkxZKTsKLSAgICAgICAgICAgIGRlcGxveW1lbnRUeXBlcy5hZGQoSkJJX0NPTVBPTkVOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcGxveW1lbnRUeXBlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbGxlY3Rpb24gcmVzb2x2ZUFydGlmYWN0KEFydGlmYWN0IGFydGlmYWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrIGRlcGVuZGVuY2llcykgdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiwgQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2plY3QgPSBwcm9qZWN0QnVpbGRlci5idWlsZEZyb21SZXBvc2l0b3J5KGFydGlmYWN0LCByZW1vdGVSZXBvcywKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXBvLCBmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS53YXJuKAotICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRldGVybWluZSBwYWNrYWdpbmcgZm9yIGRlcGVuZGVuY3kgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKyAiIGFzc3VtaW5nIGphciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldERlcGxveWFibGVQYWNrYWdpbmdUeXBlcygpLmNvbnRhaW5zKHByb2plY3QuZ2V0UGFja2FnaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2tpbmcgZm9yIGRlcGVuZGVuY3kgZnJvbSBwcm9qZWN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgICAgICAgICAgSmJpRGVwbG95YWJsZUFydGlmYWN0IGRlcGxveWFibGVBcnRpZmFjdCA9IHJlc29sdmVEZXBsb3ltZW50UGFja2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QsIGFydGlmYWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY2llcy5jb250YWlucyhkZXBsb3lhYmxlQXJ0aWZhY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZGRpbmcgZGVwZW5kZW5jeSBmcm9tIHByb2plY3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGRlcGxveWFibGVBcnRpZmFjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExpc3QgYXJ0aWZhY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGFydGlmYWN0TGlzdC5hZGRBbGwocHJvamVjdC5nZXRBcnRpZmFjdHMoKSk7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhcnRpZmFjdExpc3QsIG5ldyBBcnRpZmFjdERlcHRoQ29tcGFyYXRvcigpKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVBcnRpZmFjdCgoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpLCBkZXBlbmRlbmNpZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiSWdub3Jpbmcgbm9uLWpiaSBkZXBlbmRlbmN5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKyAiIG9mIHR5cGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2plY3QuZ2V0UGFja2FnaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEpiaURlcGxveWFibGVBcnRpZmFjdCByZXNvbHZlRGVwbG95bWVudFBhY2thZ2UoCi0gICAgICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCkgdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiwgQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFydGlmYWN0IGpiaUFydGlmYWN0ID0gZmFjdG9yeS5jcmVhdGVBcnRpZmFjdFdpdGhDbGFzc2lmaWVyKGFydGlmYWN0Ci0gICAgICAgICAgICAgICAgLmdldEdyb3VwSWQoKSwgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpLCBhcnRpZmFjdC5nZXRWZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgInppcCIsIGdldEV4dGVuc2lvbihwcm9qZWN0KSk7Ci0gICAgICAgIHJlc29sdmVyLnJlc29sdmUoamJpQXJ0aWZhY3QsIHJlbW90ZVJlcG9zLCBsb2NhbFJlcG8pOwotICAgICAgICByZXR1cm4gbmV3IEpiaURlcGxveWFibGVBcnRpZmFjdChwcm9qZWN0LmdldEFydGlmYWN0SWQoKSwgcHJvamVjdAotICAgICAgICAgICAgICAgIC5nZXRQYWNrYWdpbmcoKSwgamJpQXJ0aWZhY3QuZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbihNYXZlblByb2plY3QgcHJvamVjdDIpIHsKLSAgICAgICAgaWYgKHByb2plY3QyLmdldFBhY2thZ2luZygpLmVxdWFscyhKQklfU0VSVklDRV9BU1NFTUJMWSkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiaW5zdGFsbGVyIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBjbGFzcyBBcnRpZmFjdERlcHRoQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLSAgICAgICAgICAgIGludCBzaXplMSA9ICgoQXJ0aWZhY3QpIGFyZzApLmdldERlcGVuZGVuY3lUcmFpbCgpLnNpemUoKTsKLSAgICAgICAgICAgIGludCBzaXplMiA9ICgoQXJ0aWZhY3QpIGFyZzEpLmdldERlcGVuZGVuY3lUcmFpbCgpLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplMSA9PSBzaXplMikgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNpemUxID4gc2l6ZTIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgY2xhc3MgSmJpRGVwbG95YWJsZUFydGlmYWN0IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZTsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAgICAgcHVibGljIEpiaURlcGxveWFibGVBcnRpZmFjdChTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyBmaWxlKSB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGUgKyAiIDogIiArIGZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEpiaURlcGxveWFibGVBcnRpZmFjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKEpiaURlcGxveWFibGVBcnRpZmFjdCkgb2JqKS50b1N0cmluZygpLmVxdWFscyh0aGlzLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVJlc29sdXRpb25MaXN0ZW5lci5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVJlc29sdXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDdiNjY3Li4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlSZXNvbHV0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuUmVzb2x1dGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci0KLS8qKgotICogQGF1dGhvciBFZHdpbiBQdW56YWxhbgotICovCi1wdWJsaWMgY2xhc3MgSmJpUmVzb2x1dGlvbkxpc3RlbmVyIGltcGxlbWVudHMgUmVzb2x1dGlvbkxpc3RlbmVyIHsKLSAgICBwcml2YXRlIFN0YWNrIHBhcmVudHMgPSBuZXcgU3RhY2soKTsKLQotICAgIHByaXZhdGUgTWFwIGFydGlmYWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIE5vZGUgcm9vdE5vZGU7Ci0KLSAgICBwcml2YXRlIExvZyBsb2c7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2coTG9nIGxvZykgewotICAgICAgICB0aGlzLmxvZyA9IGxvZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9nIGdldExvZygpIHsKLSAgICAgICAgcmV0dXJuIGxvZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgLy8gZ2V0TG9nKCkuZGVidWcoInRlc3RBcnRpZmFjdDogIiArIGFydGlmYWN0KTsKLSAgICAgICAgLy8gaW50ZW50aW9uYWxseSBibGFuawotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvY2Vzc0NoaWxkcmVuKEFydGlmYWN0IGFydGlmYWN0KSB7Ci0gICAgICAgIC8vIGdldExvZygpLmRlYnVnKCJzdGFydFByb2Nlc3NDaGlsZHJlbjogIiArIGFydGlmYWN0KTsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGFydGlmYWN0cy5nZXQoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0gICAgICAgIGlmIChwYXJlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcm9vdE5vZGUgPSBub2RlOwotICAgICAgICB9Ci0gICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9jZXNzQ2hpbGRyZW4oQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgLy8gZ2V0TG9nKCkuZGVidWcoImVuZFByb2Nlc3NDaGlsZHJlbjogIiArIGFydGlmYWN0KTsKLSAgICAgICAgTm9kZSBjaGVjayA9IChOb2RlKSBwYXJlbnRzLnBvcCgpOwotICAgICAgICBhc3NlcnQgYXJ0aWZhY3QuZXF1YWxzKGNoZWNrLmFydGlmYWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbWl0Rm9yTmVhcmVyKEFydGlmYWN0IG9taXR0ZWQsIEFydGlmYWN0IGtlcHQpIHsKLSAgICAgICAgLy8gZ2V0TG9nKCkuZGVidWcoIm9taXRGb3JOZWFyZXI6IG9taXR0ZWQ9IiArIG9taXR0ZWQgKyAiLCBrZXB0PSIgKwotICAgICAgICAvLyBrZXB0KTsKLSAgICAgICAgYXNzZXJ0IG9taXR0ZWQuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAga2VwdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpKTsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGFydGlmYWN0cy5nZXQob21pdHRlZC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpKTsKLSAgICAgICAgYXNzZXJ0IG5vZGUgIT0gbnVsbDsKLSAgICAgICAgbm9kZS5hcnRpZmFjdCA9IGtlcHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb21pdEZvckN5Y2xlKEFydGlmYWN0IGFydGlmYWN0KSB7Ci0gICAgICAgIC8vIGdldExvZygpLmRlYnVnKCJvbWl0Rm9yQ3ljbGU6ICIgKyBhcnRpZmFjdCk7Ci0gICAgICAgIC8vIGludGVudGlvbmFsbHkgYmxhbmsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbmNsdWRlQXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgLy8gZ2V0TG9nKCkuZGVidWcoImluY2x1ZGVBcnRpZmFjdDogIiArIGFydGlmYWN0KTsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGFydGlmYWN0cy5nZXQoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0gICAgICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZSgpOwotICAgICAgICAgICAgYXJ0aWZhY3RzLnB1dChhcnRpZmFjdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpLCBub2RlKTsKLSAgICAgICAgfQotICAgICAgICBub2RlLmFydGlmYWN0ID0gYXJ0aWZhY3Q7Ci0gICAgICAgIGlmICghcGFyZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gKE5vZGUpIHBhcmVudHMucGVlaygpOwotICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLmFkZChub2RlKTsKLSAgICAgICAgICAgIG5vZGUucGFyZW50cy5hZGQocGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm9vdE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gcHJpbnQocm9vdE5vZGUsICIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50KE5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotICAgICAgICAvLyBnZXRMb2coKS5kZWJ1ZyhzdHJpbmcgKyByb290Tm9kZS5nZXRBcnRpZmFjdCgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTm9kZSBuID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgcHJpbnQobiwgc3RyaW5nICsgIiAgIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVTY29wZShBcnRpZmFjdCBhcnRpZmFjdCwgU3RyaW5nIHNjb3BlKSB7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJ1cGRhdGVTY29wZTogIiArIGFydGlmYWN0KTsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGFydGlmYWN0cy5nZXQoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0KLSAgICAgICAgbm9kZS5zZXRTY29wZShzY29wZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFuYWdlQXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QsIEFydGlmYWN0IHJlcGxhY2VtZW50KSB7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJtYW5hZ2VBcnRpZmFjdDogYXJ0aWZhY3Q9IiArIGFydGlmYWN0ICsgIiwgcmVwbGFjZW1lbnQ9IiArIHJlcGxhY2VtZW50KTsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGFydGlmYWN0cy5nZXQoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudC5nZXRWZXJzaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5vZGUuYXJ0aWZhY3Quc2V0VmVyc2lvbihyZXBsYWNlbWVudC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50LmdldFNjb3BlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5vZGUuYXJ0aWZhY3Quc2V0U2NvcGUocmVwbGFjZW1lbnQuZ2V0U2NvcGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVTY29wZUN1cnJlbnRQb20oQXJ0aWZhY3QgYXJ0aWZhY3QsIFN0cmluZyBrZXkpIHsKLQotICAgICAgICBnZXRMb2coKS5kZWJ1ZygidXBkYXRlU2NvcGVDdXJyZW50UG9tOiAiICsgYXJ0aWZhY3QpOwotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0VmVyc2lvbkZyb21SYW5nZShBcnRpZmFjdCBhcnRpZmFjdCkgewotCi0gICAgICAgIGdldExvZygpLmRlYnVnKCJzZWxlY3RWZXJzaW9uRnJvbVJhbmdlOiAiICsgYXJ0aWZhY3QpOwotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzdHJpY3RSYW5nZShBcnRpZmFjdCBhcnRpZmFjdCwgQXJ0aWZhY3QgYXJ0aWZhY3QxLAotICAgICAgICAgICAgVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZSkgewotCi0gICAgICAgIGdldExvZygpLmRlYnVnKCJyZXN0cmljdFJhbmdlOiAiICsgYXJ0aWZhY3QpOwotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rCi0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0Tm9kZShBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICByZXR1cm4gKE5vZGUpIGFydGlmYWN0cy5nZXQoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0QXJ0aWZhY3RzKCkgewotICAgICAgICByZXR1cm4gYXJ0aWZhY3RzLnZhbHVlcygpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBOb2RlIHsKLSAgICAgICAgcHJpdmF0ZSBTZXQ8Tm9kZT4gY2hpbGRyZW4gPSBuZXcgSGFzaFNldDxOb2RlPigpOwotCi0gICAgICAgIHByaXZhdGUgU2V0PE5vZGU+IHBhcmVudHMgPSBuZXcgSGFzaFNldDxOb2RlPigpOwotCi0gICAgICAgIHByaXZhdGUgQXJ0aWZhY3QgYXJ0aWZhY3Q7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2NvcGU7Ci0KLSAgICAgICAgcHVibGljIFNldDxOb2RlPiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBcnRpZmFjdCBnZXRBcnRpZmFjdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBhcnRpZmFjdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQ8Tm9kZT4gZ2V0UGFyZW50cygpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKLSAgICAgICAgICAgIGlmIChzY29wZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFydGlmYWN0LmdldFNjb3BlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLSAgICAgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFJvb3ROb2RlKCkgewotICAgICAgICByZXR1cm4gcm9vdE5vZGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVNlcnZpY2VBc3NlbWJseURlc2NyaXB0b3JXcml0ZXIuamF2YSBiL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlTZXJ2aWNlQXNzZW1ibHlEZXNjcmlwdG9yV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMWIwYzMuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVNlcnZpY2VBc3NlbWJseURlc2NyaXB0b3JXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmkuR2VuZXJhdGVTZXJ2aWNlQXNzZW1ibHlEZXNjcmlwdG9yTW9qby5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuUHJldHR5UHJpbnRYTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YTUxXcml0ZXI7Ci0KLS8qKgotICogSGVscGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdGhlIGpiaS54bWwgZm9yIGEgc2VydmljZSBhc3NlbWJseQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKYmlTZXJ2aWNlQXNzZW1ibHlEZXNjcmlwdG9yV3JpdGVyIGV4dGVuZHMKLSAgICAgICAgQWJzdHJhY3REZXNjcmlwdG9yV3JpdGVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVuY29kaW5nOwotCi0gICAgcHVibGljIEpiaVNlcnZpY2VBc3NlbWJseURlc2NyaXB0b3JXcml0ZXIoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShGaWxlIGRlc2NyaXB0b3IsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICBMaXN0IHVyaXMsIExpc3QgY29ubmVjdGlvbnMpIHRocm93cyBKYmlQbHVnaW5FeGNlcHRpb24gewotICAgICAgICBQcmludFdyaXRlciB3OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdyA9IG5ldyBQcmludFdyaXRlcihkZXNjcmlwdG9yLCBlbmNvZGluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmJpUGx1Z2luRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgb3BlbmluZyBmaWxlWyIKLSAgICAgICAgICAgICAgICAgICAgKyBkZXNjcmlwdG9yLmdldEFic29sdXRlUGF0aCgpICsgIl0iLCBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxXcml0ZXIgd3JpdGVyID0gbmV3IFByZXR0eVByaW50WE1MV3JpdGVyKHcsIGVuY29kaW5nLCBudWxsKTsKLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgiamJpIik7Ci0gICAgICAgIHdyaXRlci5hZGRBdHRyaWJ1dGUoInhtbG5zIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2piaSIpOwotICAgICAgICB3cml0ZXIuYWRkQXR0cmlidXRlKCJ2ZXJzaW9uIiwgIjEuMCIpOwotCi0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoInNlcnZpY2UtYXNzZW1ibHkiKTsKLQotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJpZGVudGlmaWNhdGlvbiIpOwotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJuYW1lIik7Ci0gICAgICAgIHdyaXRlci53cml0ZVRleHQobmFtZSk7Ci0gICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0gICAgICAgIHdyaXRlci53cml0ZVRleHQoZGVzY3JpcHRpb24pOwotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB1cmlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIERlcGVuZGVuY3lJbmZvcm1hdGlvbiBzZXJ2aWNlVW5pdEluZm8gPSAoRGVwZW5kZW5jeUluZm9ybWF0aW9uKSBpdAotICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotICAgICAgICAgICAgd3JpdGVTZXJ2aWNlVW5pdCh3cml0ZXIsIHNlcnZpY2VVbml0SW5mbyk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29ubmVjdGlvbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJjb25uZWN0aW9ucyIpOwotCi0gICAgICAgICAgICBNYXAgbmFtZXNwYWNlTWFwID0gYnVpbGROYW1lc3BhY2VNYXAoY29ubmVjdGlvbnMpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbm5lY3Rpb25zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBHZW5lcmF0ZVNlcnZpY2VBc3NlbWJseURlc2NyaXB0b3JNb2pvLkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChHZW5lcmF0ZVNlcnZpY2VBc3NlbWJseURlc2NyaXB0b3JNb2pvLkNvbm5lY3Rpb24pIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotICAgICAgICAgICAgICAgIHdyaXRlQ29ubmVjdGlvbihuYW1lc3BhY2VNYXAsIHdyaXRlciwgY29ubmVjdGlvbik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIGNsb3NlKHcpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIGJ1aWxkTmFtZXNwYWNlTWFwKExpc3QgY29ubmVjdGlvbnMpIHsKLSAgICAgICAgTGlzdCBjb25zdW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBwcm92aWRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbm5lY3Rpb25zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEdlbmVyYXRlU2VydmljZUFzc2VtYmx5RGVzY3JpcHRvck1vam8uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEdlbmVyYXRlU2VydmljZUFzc2VtYmx5RGVzY3JpcHRvck1vam8uQ29ubmVjdGlvbikgaXQKLSAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLSAgICAgICAgICAgIGNvbnN1bWVzLmFkZChjb25uZWN0aW9uLmdldENvbnN1bWVzKCkpOwotICAgICAgICAgICAgcHJvdmlkZXMuYWRkKGNvbm5lY3Rpb24uZ2V0UHJvdmlkZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlTWFwKHByb3ZpZGVzLCBjb25zdW1lcyk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVDb25uZWN0aW9uKE1hcCBuYW1lc3BhY2VNYXAsIFhNTFdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgiY29ubmVjdGlvbiIpOwotICAgICAgICBpZiAoY29ubmVjdGlvbi5nZXRDb25zdW1lcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoImNvbnN1bWVyIik7Ci0gICAgICAgICAgICBhZGRRTmFtZUF0dHJpYnV0ZSh3cml0ZXIsICJpbnRlcmZhY2UtbmFtZSIsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldENvbnN1bWVzKCkuZ2V0SW50ZXJmYWNlTmFtZSgpLCBuYW1lc3BhY2VNYXApOwotICAgICAgICAgICAgYWRkUU5hbWVBdHRyaWJ1dGUod3JpdGVyLCAic2VydmljZS1uYW1lIiwgY29ubmVjdGlvbi5nZXRDb25zdW1lcygpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTZXJ2aWNlTmFtZSgpLCBuYW1lc3BhY2VNYXApOwotICAgICAgICAgICAgYWRkU3RyaW5nQXR0cmlidXRlKHdyaXRlciwgImVuZHBvaW50LW5hbWUiLCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdW1lcygpLmdldEVuZHBvaW50TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbm5lY3Rpb24uZ2V0UHJvdmlkZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJwcm92aWRlciIpOwotICAgICAgICAgICAgYWRkUU5hbWVBdHRyaWJ1dGUod3JpdGVyLCAiaW50ZXJmYWNlLW5hbWUiLCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm92aWRlcygpLmdldEludGVyZmFjZU5hbWUoKSwgbmFtZXNwYWNlTWFwKTsKLSAgICAgICAgICAgIGFkZFFOYW1lQXR0cmlidXRlKHdyaXRlciwgInNlcnZpY2UtbmFtZSIsIGNvbm5lY3Rpb24uZ2V0UHJvdmlkZXMoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZU5hbWUoKSwgbmFtZXNwYWNlTWFwKTsKLSAgICAgICAgICAgIGFkZFN0cmluZ0F0dHJpYnV0ZSh3cml0ZXIsICJlbmRwb2ludC1uYW1lIiwgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvdmlkZXMoKS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVNlcnZpY2VVbml0KFhNTFdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICBEZXBlbmRlbmN5SW5mb3JtYXRpb24gc2VydmljZVVuaXRJbmZvKSB0aHJvd3MgSmJpUGx1Z2luRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgic2VydmljZS11bml0Iik7Ci0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoImlkZW50aWZpY2F0aW9uIik7Ci0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoIm5hbWUiKTsKLSAgICAgICAgd3JpdGVyLndyaXRlVGV4dChzZXJ2aWNlVW5pdEluZm8uZ2V0TmFtZSgpKTsKLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICAgICAgaWYgKHNlcnZpY2VVbml0SW5mby5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZVRleHQoc2VydmljZVVuaXRJbmZvLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlVGV4dChzZXJ2aWNlVW5pdEluZm8uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoInRhcmdldCIpOwotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJhcnRpZmFjdHMtemlwIik7Ci0gICAgICAgIHdyaXRlci53cml0ZVRleHQoc2VydmljZVVuaXRJbmZvLmdldEZpbGVuYW1lKCkpOwotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoImNvbXBvbmVudC1uYW1lIik7Ci0gICAgICAgIHdyaXRlci53cml0ZVRleHQoc2VydmljZVVuaXRJbmZvLmdldENvbXBvbmVudCgpKTsKLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLQotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlKFdyaXRlciBjbG9zZWFibGUpIHsKLSAgICAgICAgaWYgKGNsb3NlYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsb3NlYWJsZS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiB3YXJuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlTZXJ2aWNlRmlsZUFuYWx5emVyLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvSmJpU2VydmljZUZpbGVBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTk4N2E2Li4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlTZXJ2aWNlRmlsZUFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5jb21tb24ucGFja2FnaW5nLkNvbnN1bWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5jb21tb24ucGFja2FnaW5nLlByb3ZpZGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5jb21tb24ucGFja2FnaW5nLlNlcnZpY2VVbml0QW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEEgZHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlcnZpY2VVbml0QW5hbHl6ZXIgdGhhdCBhbGxvd3MgeW91IHRvIGdlbmVyYXRlCi0gKiB0aGUgY29uc3VtZXMgYW5kIHByb3ZpZGVzIGZyb20gYSBzaW1wbGUgWE1MIGZpbGUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYmlTZXJ2aWNlRmlsZUFuYWx5emVyIGltcGxlbWVudHMgU2VydmljZVVuaXRBbmFseXplciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQklfTkFNRVNQQUNFID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2piaSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3QgY29uc3VtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3QgcHJvdmlkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRDb25zdW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN1bWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFByb3ZpZGVzKCkgewotICAgICAgICByZXR1cm4gcHJvdmlkZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChGaWxlIGV4cGxvZGVkU2VydmljZVVuaXRSb290KSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYmlTZXJ2aWNlc0ZpbGUoRmlsZSBqYmlTZXJ2aWNlc0ZpbGUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcGFyc2VYbWwoamJpU2VydmljZXNGaWxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VYbWwoRmlsZSBqYmlTZXJ2aWNlc0ZpbGUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UoamJpU2VydmljZXNGaWxlKTsKLQotICAgICAgICAgICAgLy8gU3RvcCBhdCBmaXJzdCBzZXJ2aWNlcyBjaGlsZCBub2RlIHRoYXQgaXMgZm91bmQKLSAgICAgICAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBkb2MuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgTm9kZSBzZXJ2aWNlc05vZGUgPSBudWxsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoWG1sRGVzY3JpcHRvckhlbHBlci5pc0VsZW1lbnQoY2hpbGROb2Rlcy5pdGVtKGkpLCBKQklfTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAic2VydmljZXMiKSkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc05vZGUgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlc05vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgcHJvY2VzcyB0aGUgY2hpbGRyZW4KLSAgICAgICAgICAgICAgICBFbGVtZW50IHNlcnZpY2VzRWxlbWVudCA9IChFbGVtZW50KSBzZXJ2aWNlc05vZGU7Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBzZXJ2aWNlc0VsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sRGVzY3JpcHRvckhlbHBlci5pc0VsZW1lbnQoY2hpbGRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQklfTkFNRVNQQUNFLCAiY29uc3VtZXMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bWVzIG5ld0NvbnN1bWVzID0gbmV3IENvbnN1bWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29uc3VtZXMuc2V0RW5kcG9pbnROYW1lKFhtbERlc2NyaXB0b3JIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludE5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29uc3VtZXMuc2V0SW50ZXJmYWNlTmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlTmFtZShjaGlsZEVsZW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb25zdW1lcy5zZXRTZXJ2aWNlTmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZU5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXMuYWRkKG5ld0NvbnN1bWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWG1sRGVzY3JpcHRvckhlbHBlci5pc0VsZW1lbnQoY2hpbGRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQklfTkFNRVNQQUNFLCAicHJvdmlkZXMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVzIG5ld1Byb3ZpZGVzID0gbmV3IFByb3ZpZGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvdmlkZXMuc2V0RW5kcG9pbnROYW1lKFhtbERlc2NyaXB0b3JIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludE5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvdmlkZXMuc2V0SW50ZXJmYWNlTmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlTmFtZShjaGlsZEVsZW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm92aWRlcy5zZXRTZXJ2aWNlTmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZU5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMuYWRkKG5ld1Byb3ZpZGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSAiCi0gICAgICAgICAgICAgICAgICAgICsgamJpU2VydmljZXNGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlTZXJ2aWNlVW5pdERlc2NyaXB0b3JXcml0ZXIuamF2YSBiL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlTZXJ2aWNlVW5pdERlc2NyaXB0b3JXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0OWZhNi4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvSmJpU2VydmljZVVuaXREZXNjcmlwdG9yV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguY29tbW9uLnBhY2thZ2luZy5Db25zdW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguY29tbW9uLnBhY2thZ2luZy5Qcm92aWRlczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlByZXR0eVByaW50WE1MV3JpdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWE1MV3JpdGVyOwotCi0vKioKLSAqIEhlbHBlciB0aGF0IGlzIHVzZWQgdG8gd3JpdGUgdGhlIGpiaS54bWwgZm9yIGEgc2VydmljZSB1bml0Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpiaVNlcnZpY2VVbml0RGVzY3JpcHRvcldyaXRlciBleHRlbmRzIEFic3RyYWN0RGVzY3JpcHRvcldyaXRlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlbmNvZGluZzsKLQotICAgIHB1YmxpYyBKYmlTZXJ2aWNlVW5pdERlc2NyaXB0b3JXcml0ZXIoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShGaWxlIGRlc2NyaXB0b3IsIAotICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYmMsIAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgTGlzdCB1cmlzLCAKLSAgICAgICAgICAgICAgICAgICAgICBMaXN0IGNvbnN1bWVzLCAKLSAgICAgICAgICAgICAgICAgICAgICBMaXN0IHByb3ZpZGVzKSB0aHJvd3MgSmJpUGx1Z2luRXhjZXB0aW9uIHsKLSAgICAgICAgUHJpbnRXcml0ZXIgdzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHcgPSBuZXcgUHJpbnRXcml0ZXIoZGVzY3JpcHRvciwgZW5jb2RpbmcpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpiaVBsdWdpbkV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIG9wZW5pbmcgZmlsZVsiCi0gICAgICAgICAgICAgICAgICAgICsgZGVzY3JpcHRvci5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIiwgZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MV3JpdGVyIHdyaXRlciA9IG5ldyBQcmV0dHlQcmludFhNTFdyaXRlcih3LCBlbmNvZGluZywgbnVsbCk7Ci0gICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoImpiaSIpOwotICAgICAgICB3cml0ZXIuYWRkQXR0cmlidXRlKCJ4bWxucyIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYmkiKTsKLSAgICAgICAgd3JpdGVyLmFkZEF0dHJpYnV0ZSgidmVyc2lvbiIsICIxLjAiKTsKLQotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJzZXJ2aWNlcyIpOwotICAgICAgICB3cml0ZXIuYWRkQXR0cmlidXRlKCJiaW5kaW5nLWNvbXBvbmVudCIsIGJjID8gInRydWUiIDogImZhbHNlIik7Ci0KLSAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgYWxsIHRoZSBuYW1lc3BhY2VzIGludG8gYSBoYXNobWFwIHNvIHdlCi0gICAgICAgIC8vIGNhbiBnZXQgdGhlIFFOYW1lIG91dHB1dCBjb3JyZWN0bHkKLSAgICAgICAgTWFwIG5hbWVzcGFjZU1hcCA9IGdldE5hbWVzcGFjZU1hcChwcm92aWRlcywgY29uc3VtZXMpOwotCi0gICAgICAgIC8vIFNldC11cCB0aGUgbmFtZXNwYWNlcwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXNwYWNlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgbmFtZXNwYWNlRGVjbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIG5hbWVzcGFjZURlY2wuYXBwZW5kKCJ4bWxuczoiKTsKLSAgICAgICAgICAgIG5hbWVzcGFjZURlY2wuYXBwZW5kKG5hbWVzcGFjZU1hcC5nZXQoa2V5KSk7Ci0gICAgICAgICAgICB3cml0ZXIuYWRkQXR0cmlidXRlKG5hbWVzcGFjZURlY2wudG9TdHJpbmcoKSwga2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFB1dCBpbiB0aGUgcHJvdmlkZXMKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb3ZpZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFByb3ZpZGVzIHByb3ZpZGVzRW50cnkgPSAoUHJvdmlkZXMpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoInByb3ZpZGVzIik7Ci0gICAgICAgICAgICBhZGRRTmFtZUF0dHJpYnV0ZSh3cml0ZXIsICJpbnRlcmZhY2UtbmFtZSIsIHByb3ZpZGVzRW50cnkKLSAgICAgICAgICAgICAgICAgICAgLmdldEludGVyZmFjZU5hbWUoKSwgbmFtZXNwYWNlTWFwKTsKLSAgICAgICAgICAgIGFkZFFOYW1lQXR0cmlidXRlKHdyaXRlciwgInNlcnZpY2UtbmFtZSIsIHByb3ZpZGVzRW50cnkKLSAgICAgICAgICAgICAgICAgICAgLmdldFNlcnZpY2VOYW1lKCksIG5hbWVzcGFjZU1hcCk7Ci0gICAgICAgICAgICBhZGRTdHJpbmdBdHRyaWJ1dGUod3JpdGVyLCAiZW5kcG9pbnQtbmFtZSIsIHByb3ZpZGVzRW50cnkKLSAgICAgICAgICAgICAgICAgICAgLmdldEVuZHBvaW50TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQdXQgaW4gdGhlIGNvbnN1bWVzCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25zdW1lcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBDb25zdW1lcyBjb25zdW1lc0VudHJ5ID0gKENvbnN1bWVzKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJjb25zdW1lcyIpOwotICAgICAgICAgICAgYWRkUU5hbWVBdHRyaWJ1dGUod3JpdGVyLCAiaW50ZXJmYWNlLW5hbWUiLCBjb25zdW1lc0VudHJ5Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRJbnRlcmZhY2VOYW1lKCksIG5hbWVzcGFjZU1hcCk7Ci0gICAgICAgICAgICBhZGRRTmFtZUF0dHJpYnV0ZSh3cml0ZXIsICJzZXJ2aWNlLW5hbWUiLCBjb25zdW1lc0VudHJ5Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRTZXJ2aWNlTmFtZSgpLCBuYW1lc3BhY2VNYXApOwotICAgICAgICAgICAgYWRkU3RyaW5nQXR0cmlidXRlKHdyaXRlciwgImVuZHBvaW50LW5hbWUiLCBjb25zdW1lc0VudHJ5Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE8gSGFuZGxpbmcgb2YgTGlua1R5cGU/Ci0KLSAgICAgICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgY2xvc2Uodyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlKFdyaXRlciBjbG9zZWFibGUpIHsKLSAgICAgICAgaWYgKGNsb3NlYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsb3NlYWJsZS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiB3YXJuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlTaGFyZWRMaWJyYXJ5RGVzY3JpcHRvcldyaXRlci5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVNoYXJlZExpYnJhcnlEZXNjcmlwdG9yV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NGY4ODEuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVNoYXJlZExpYnJhcnlEZXNjcmlwdG9yV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlByZXR0eVByaW50WE1MV3JpdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWE1MV3JpdGVyOwotCi0vKioKLSAqIEhlbHBlciB0aGF0IGlzIHVzZWQgdG8gd3JpdGUgdGhlIGpiaS54bWwgZm9yIGEgc2hhcmVkIGxpYnJhcnkKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSmJpU2hhcmVkTGlicmFyeURlc2NyaXB0b3JXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZW5jb2Rpbmc7Ci0KLSAgICBwdWJsaWMgSmJpU2hhcmVkTGlicmFyeURlc2NyaXB0b3JXcml0ZXIoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShGaWxlIGRlc2NyaXB0b3IsIAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24sIAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc0xvYWRlckRlbGVnYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgIExpc3QgdXJpcykgdGhyb3dzIEpiaVBsdWdpbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFByaW50V3JpdGVyIHc7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3ID0gbmV3IFByaW50V3JpdGVyKGRlc2NyaXB0b3IsIGVuY29kaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKYmlQbHVnaW5FeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBvcGVuaW5nIGZpbGVbIgotICAgICAgICAgICAgICAgICAgICArIGRlc2NyaXB0b3IuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIsIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFdyaXRlciB3cml0ZXIgPSBuZXcgUHJldHR5UHJpbnRYTUxXcml0ZXIodywgZW5jb2RpbmcsIG51bGwpOwotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJqYmkiKTsKLSAgICAgICAgd3JpdGVyLmFkZEF0dHJpYnV0ZSgieG1sbnMiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamJpIik7Ci0gICAgICAgIHdyaXRlci5hZGRBdHRyaWJ1dGUoInZlcnNpb24iLCAiMS4wIik7Ci0KLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgic2hhcmVkLWxpYnJhcnkiKTsKLSAgICAgICAgd3JpdGVyLmFkZEF0dHJpYnV0ZSgiY2xhc3MtbG9hZGVyLWRlbGVnYXRpb24iLCBjbGFzc0xvYWRlckRlbGVnYXRpb24pOwotICAgICAgICB3cml0ZXIuYWRkQXR0cmlidXRlKCJ2ZXJzaW9uIiwgdmVyc2lvbik7Ci0KLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgiaWRlbnRpZmljYXRpb24iKTsKLSAgICAgICAgd3JpdGVyLnN0YXJ0RWxlbWVudCgibmFtZSIpOwotICAgICAgICB3cml0ZXIud3JpdGVUZXh0KG5hbWUpOwotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotICAgICAgICB3cml0ZXIud3JpdGVUZXh0KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLSAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLQotICAgICAgICB3cml0ZXIuc3RhcnRFbGVtZW50KCJzaGFyZWQtbGlicmFyeS1jbGFzcy1wYXRoIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB1cmlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIERlcGVuZGVuY3lJbmZvcm1hdGlvbiBkZXBlbmRlbmN5ID0gKERlcGVuZGVuY3lJbmZvcm1hdGlvbikgaXQKLSAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKLSAgICAgICAgICAgIHdyaXRlci5zdGFydEVsZW1lbnQoInBhdGgtZWxlbWVudCIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlVGV4dChkZXBlbmRlbmN5LmdldEZpbGVuYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVyLmVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIHdyaXRlci5lbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgY2xvc2Uodyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlKFdyaXRlciBjbG9zZWFibGUpIHsKLSAgICAgICAgaWYgKGNsb3NlYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsb3NlYWJsZS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiB3YXJuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9NYWtlU2VydmljZU1peERpcnNNb2pvLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvTWFrZVNlcnZpY2VNaXhEaXJzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQxODMzLi4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9NYWtlU2VydmljZU1peERpcnNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi0vKioKLSAqIENyZWF0ZXMgYSBiaW5hcnkgc2VydmljZW1peCBpbnN0YWxsIGRpcmVjdG9yeSB0aGF0IGNhbiB0aGVuIGJlIHJlZmVyZW5jZWQKLSAqIGJ5IGEgc3ByaW5nLnhtbCBmaWxlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0aW5nLgotICogCi0gKiBAdmVyc2lvbiAkSWQ6ICQKLSAqIEBnb2FsIGNyZWF0ZURpcnMKLSAqIEBleGVjdXRlIHBoYXNlPSJ0ZXN0LWNvbXBpbGUiCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgU2VydmljZU1peCBydW50aW1lIGRpcmVjdG9yaWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWtlU2VydmljZU1peERpcnNNb2pvIGV4dGVuZHMgSmJpUHJvamVjdERlcGxveWVyTW9qbyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVwbG95IGRpcmV0b3J5IHRvIHB1dCB0aGUgc2VydmljZSBhc3NlbWJsaWVzIGluc2lkZQotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zZXJ2aWNlbWl4L2RlcGxveSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZXBsb3lEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InRydWUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNsZWFuU3RhcnQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBpZiAoY2xlYW5TdGFydCkgewotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2xlYW5pbmcgU2VydmljZU1peCByb290IGRpcmVjdG9yeSBbIiArIGRlcGxveURpcmVjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0gICAgICAgICAgICAgICAgRmlsZSByb290RGlyID0gbmV3IEZpbGUoZGVwbG95RGlyZWN0b3J5KTsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3J5KHJvb3REaXIpOwotICAgICAgICAgICAgICAgIHJvb3REaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlcGxveVByb2plY3QoKTsKLQotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiUHJvamVjdCBkZXBsb3llZCIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkFwYWNoZSBTZXJ2aWNlTWl4IHdhcyB1bmFibGUgdG8gZGVwbG95IHByb2plY3QiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVwbG95RGVwZW5kZW5jeShKYmlEZXBsb3lhYmxlQXJ0aWZhY3QgamJpRGVwbG95YWJsZSwgYm9vbGVhbiBkb0RlZmVyRXhjZXB0aW9ucykgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIFN0cmluZyBuYW1lID0gamJpRGVwbG95YWJsZS5nZXRUeXBlKCk7Ci0gICAgICAgIGdldExvZygpLmluZm8oImRlcGxveURlcGVuZGVuY3k6IHR5cGU6ICIgKyBuYW1lICsgIiBkZXBlbmRlbmN5OiAiICsgamJpRGVwbG95YWJsZSk7Ci0gICAgICAgIGlmIChKQklfU0VSVklDRV9BU1NFTUJMWS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgIEZpbGUgYXNzZW1ibHlGaWxlID0gbmV3IEZpbGUoamJpRGVwbG95YWJsZS5nZXRGaWxlKCkpOwotICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoZGVwbG95RGlyZWN0b3J5LCBhc3NlbWJseUZpbGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiY29weWluZyBzZXJ2aWNlIEFzc2VtYmx5ITogICIgKyBqYmlEZXBsb3lhYmxlICsgIiB0bzogIiArIG91dHB1dEZpbGUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoYXNzZW1ibHlGaWxlLCBvdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL0BPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0RGVwZW5kZW5jeShKYmlQcm9qZWN0RGVwbG95ZXJNb2pvLkpiaURlcGxveWFibGVBcnRpZmFjdCBqYmlEZXBsb3lhYmxlKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvL0BPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHN0b3BEZXBlbmRlbmN5KEpiaURlcGxveWFibGVBcnRpZmFjdCBqYmlEZXBsb3lhYmxlKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvL0BPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVwbG95ZWQoSmJpRGVwbG95YWJsZUFydGlmYWN0IGpiaURlcGxveWFibGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9TZXJ2aWNlTWl4RW1iZWRkZWRNb2pvLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvU2VydmljZU1peEVtYmVkZGVkTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UxNzI1Li4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9TZXJ2aWNlTWl4RW1iZWRkZWRNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS54YmVhbi5zcHJpbmcuY29udGV4dC5GaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuRGlzcG9zYWJsZUJlYW47DQotDQotLyoqDQotICogU3RhcnRzIGEgU2VydmljZU1peCBKQkkgY29udGFpbmVyIGluIGVtYmVkZGVkIG1vZGUgdXNpbmcgdGhlIHNlcnZpY2VtaXgueG1sDQotICogDQotICogQGF1dGhvciA8YSBocmVmPSJwZG9kZHNAYXBhY2hlLm9yZyI+UGhpbGlwIERvZGRzPC9hPg0KLSAqIEB2ZXJzaW9uICRJZDogR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qbyAzMTQ5NTYgMjAwNS0xMC0xMiAxNjoyNzoxNVoNCi0gKiAgICAgICAgICBicmV0dCAkDQotICogQGdvYWwgZW1iZWRkZWRTZXJ2aWNlbWl4DQotICogQGV4ZWN1dGUgcGhhc2U9ImNvbXBpbGUiDQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQ0KLSAqIEBkZXNjcmlwdGlvbiBTdGFydHMgYSBsb2NhbCBzZXJ2aWNlbWl4IGluc3RhbmNlIHVzaW5nIHRoZSBzZXJ2aWNlbWl4IGNvbmZpZw0KLSAqICAgICAgICAgICAgICBwcm92aWRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlTWl4RW1iZWRkZWRNb2pvIGV4dGVuZHMgQWJzdHJhY3RKYmlNb2pvIHsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvc2VydmljZW1peC54bWwiDQotICAgICAqLw0KLSAgICBwcml2YXRlIEZpbGUgc2VydmljZW1peENvbmZpZzsNCi0NCi0gICAgcHJpdmF0ZSBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7DQotDQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBzdGFydFNlcnZpY2VNaXgoKTsNCi0NCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgew0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbigiSW50ZXJydXB0ZWQiKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBEaXNwb3NhYmxlQmVhbikgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgKChEaXNwb3NhYmxlQmVhbikgY29udGV4dCkuZGVzdHJveSgpOw0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IA0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzdGFydFNlcnZpY2VNaXgoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7DQotICAgICAgICBDbGFzc0xvYWRlciBvbGQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihnZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNvbnRleHQoImZpbGU6Ly8vIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlbWl4Q29uZmlnLmdldEFic29sdXRlUGF0aCgpKTsNCi0gICAgICAgICAgICBjb250ZXh0LmdldEJlYW4oImpiaSIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc3RhcnQgdGhlIFNlcnZpY2VNaXggY29udGFpbmVyIiwgZSk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9sZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL1NlcnZpY2VNaXhNb2pvLmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvU2VydmljZU1peE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjNTdlOS4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvU2VydmljZU1peE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YXguamJpLkpCSUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5jb250YWluZXIuSkJJQ29udGFpbmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci0KLS8qKgotICogU3RhcnRzIGEgU2VydmljZU1peCBKQkkgY29udGFpbmVyIGFuZCB0aGVtIHVzZXMgdGhlIGRlcGxveSBwcm9qZWN0IE1PSk8gdG8KLSAqIHB1c2ggdGhlIGN1cnJlbnQgcHJvamVjdCBhbmQgZGVwZW5kZW5jaWVzIHRvIGl0Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0icGRvZGRzQGFwYWNoZS5vcmciPlBoaWxpcCBEb2RkczwvYT4KLSAqIEB2ZXJzaW9uICRJZDogR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qbyAzMTQ5NTYgMjAwNS0xMC0xMiAxNjoyNzoxNVoKLSAqICAgICAgICAgIGJyZXR0ICQKLSAqIEBnb2FsIHNlcnZpY2VtaXgKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqIEBkZXNjcmlwdGlvbiBpbnN0YWxscyB0aGUgcHJvamVjdCAoYW5kIGFsbCBkZXBlbmRlbmNpZXMpIHRvIGEgbG9jYWwKLSAqICAgICAgICAgICAgICBTZXJ2aWNlTWl4IGluc3RhbmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlTWl4TW9qbyBleHRlbmRzIEpiaVByb2plY3REZXBsb3llck1vam8gewotCi0gICAgcHJpdmF0ZSBKQklDb250YWluZXIgamJpQ29udGFpbmVyOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zZXJ2aWNlbWl4L2luc3RhbGwiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5zdGFsbERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2VydmljZW1peC9kZXBsb3kiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVwbG95bWVudERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2VydmljZW1peC9yb290RGlyIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJvb3REaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InRydWUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNsZWFuU3RhcnQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBpZiAoY2xlYW5TdGFydCkgewotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2xlYW5pbmcgU2VydmljZU1peCByb290IGRpcmVjdG9yeSBbIiArIHJvb3REaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOwotICAgICAgICAgICAgICAgIEZpbGUgcm9vdERpciA9IG5ldyBGaWxlKHJvb3REaXJlY3RvcnkpOwotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcnkocm9vdERpcik7Ci0gICAgICAgICAgICAgICAgcm9vdERpci5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhcnRTZXJ2aWNlTWl4KCk7Ci0gICAgICAgICAgICBkZXBsb3lQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIlByb2plY3QgZGVwbG95ZWQiKTsKLQotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzdG9wU2VydmljZU1peCgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJBcGFjaGUgU2VydmljZU1peCB3YXMgdW5hYmxlIHRvIGRlcGxveSBwcm9qZWN0IiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdG9wU2VydmljZU1peCgpIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiU2h1dHRpbmcgZG93biBBcGFjaGUgU2VydmljZU1peCIpOwotICAgICAgICBpZiAoamJpQ29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgamJpQ29udGFpbmVyLnNodXREb3duKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKQklFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRTZXJ2aWNlTWl4KCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiU3RhcnRpbmcgQXBhY2hlIFNlcnZpY2VNaXgiKTsKLSAgICAgICAgICAgIGpiaUNvbnRhaW5lciA9IG5ldyBKQklDb250YWluZXIoKTsKLSAgICAgICAgICAgIGpiaUNvbnRhaW5lci5zZXRSbWlQb3J0KEludGVnZXIucGFyc2VJbnQocG9ydCkpOwotICAgICAgICAgICAgamJpQ29udGFpbmVyLnNldENyZWF0ZU1CZWFuU2VydmVyKHRydWUpOwotICAgICAgICAgICAgamJpQ29udGFpbmVyLnNldEluc3RhbGxhdGlvbkRpclBhdGgoaW5zdGFsbERpcmVjdG9yeSk7Ci0gICAgICAgICAgICBqYmlDb250YWluZXIuc2V0RGVwbG95bWVudERpclBhdGgoZGVwbG95bWVudERpcmVjdG9yeSk7Ci0gICAgICAgICAgICBqYmlDb250YWluZXIuc2V0Um9vdERpcihyb290RGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGpiaUNvbnRhaW5lci5pbml0KCk7Ci0gICAgICAgICAgICBqYmlDb250YWluZXIuc3RhcnQoKTsKLSAgICAgICAgfSBjYXRjaCAoSkJJRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHN0YXJ0IHRoZSBKQkkgY29udGFpbmVyIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvWG1sRGVzY3JpcHRvckhlbHBlci5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL1htbERlc2NyaXB0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZGNjMy4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvWG1sRGVzY3JpcHRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIFhtbERlc2NyaXB0b3JIZWxwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdHJhbnNpZW50IExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihYbWxEZXNjcmlwdG9ySGVscGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgWG1sRGVzY3JpcHRvckhlbHBlcigpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRTZXJ2aWNlTmFtZShFbGVtZW50IGNoaWxkRWxlbWVudCkgewotICAgICAgICBpZiAoY2hpbGRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgic2VydmljZS1uYW1lIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXhBbmRMb2NhbFBhcnQgPSBjaGlsZEVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgic2VydmljZS1uYW1lIik7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcHJlZml4QW5kTG9jYWxQYXJ0LnN1YnN0cmluZygwLCBwcmVmaXhBbmRMb2NhbFBhcnQKLSAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YoJzonKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gcHJlZml4QW5kTG9jYWxQYXJ0LnN1YnN0cmluZyhwcmVmaXhBbmRMb2NhbFBhcnQKLSAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YoJzonKSArIDEpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShjaGlsZEVsZW1lbnQubG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCksIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRJbnRlcmZhY2VOYW1lKEVsZW1lbnQgY2hpbGRFbGVtZW50KSB7Ci0gICAgICAgIGlmIChjaGlsZEVsZW1lbnQuaGFzQXR0cmlidXRlKCJpbnRlcmZhY2UtbmFtZSIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4QW5kTG9jYWxQYXJ0ID0gY2hpbGRFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoImludGVyZmFjZS1uYW1lIik7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcHJlZml4QW5kTG9jYWxQYXJ0LnN1YnN0cmluZygwLCBwcmVmaXhBbmRMb2NhbFBhcnQKLSAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YoJzonKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gcHJlZml4QW5kTG9jYWxQYXJ0LnN1YnN0cmluZyhwcmVmaXhBbmRMb2NhbFBhcnQKLSAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YoJzonKSArIDEpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShjaGlsZEVsZW1lbnQubG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCksIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWxlbWVudChOb2RlIG5vZGUsIFN0cmluZyBuYW1lc3BhY2VVcmwsCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0KSB7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoIkdvdCBFbGVtZW50IG5vZGVOYW1lOiIgKyBlbGVtZW50LmdldE5vZGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG5hbWVzcGFjZVVyaToiICsgZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgICAgICArICIgbG9jYWxOYW1lOiIgKyBlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChsb2NhbFBhcnQuZXF1YWxzKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgbmFtZXNwYWNlIFVSSSBhbmQgbG9jYWxuYW1lCi0gICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnKG5hbWVzcGFjZVVybCArICI9IiArIGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG5hbWVzcGFjZVVybC5lcXVhbHMoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpOwotICAgICAgICAgICAgICAgIExPR0dFUi5kZWJ1Zyhsb2NhbFBhcnQgKyAiPSIgKyBlbGVtZW50LmdldExvY2FsTmFtZSgpICsgIiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxvY2FsUGFydC5lcXVhbHMoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlVXJsLmVxdWFscyhlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChsb2NhbFBhcnQuZXF1YWxzKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVuZHBvaW50TmFtZShFbGVtZW50IGNoaWxkRWxlbWVudCkgewotICAgICAgICBpZiAoY2hpbGRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiZW5kcG9pbnQtbmFtZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZW5kcG9pbnQtbmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRiOGY3Li4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS0tPgotPGNvbXBvbmVudC1zZXQ+Ci0gIDxjb21wb25lbnRzPgotICAgIDwhLS1jb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuQXJ0aWZhY3RIYW5kbGVyPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5qYXI8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuRGVmYXVsdEFydGlmYWN0SGFuZGxlcjwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgPHR5cGU+amFyPC90eXBlPgotICAgICAgICA8ZXh0ZW5zaW9uPmphcjwvZXh0ZW5zaW9uPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50LS0+Ci0gICAgPGNvbXBvbmVudD4KLSAgICAgIDxyb2xlPm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5BcnRpZmFjdEhhbmRsZXI8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PmpiaS1jb21wb25lbnQ8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuRGVmYXVsdEFydGlmYWN0SGFuZGxlcjwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgPHR5cGU+amJpLWNvbXBvbmVudDwvdHlwZT4KLSAgICAgICAgPGV4dGVuc2lvbj5qYXI8L2V4dGVuc2lvbj4KLSAgICAgICAgPGxhbmd1YWdlPmphdmE8L2xhbmd1YWdlPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkxpZmVjeWNsZU1hcHBpbmc8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PmpiaS1jb21wb25lbnQ8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkRlZmF1bHRMaWZlY3ljbGVNYXBwaW5nPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8cGhhc2VzPgotICAgICAgICAgIDxnZW5lcmF0ZS1yZXNvdXJjZXM+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc6amJpLW1hdmVuLXBsdWdpbjpnZW5lcmF0ZS1qYmktY29tcG9uZW50LWRlc2NyaXB0b3I8L2dlbmVyYXRlLXJlc291cmNlcz4KLSAgICAgICAgICA8cHJvY2Vzcy1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46cmVzb3VyY2VzPC9wcm9jZXNzLXJlc291cmNlcz4KLSAgICAgICAgICA8Y29tcGlsZT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tY29tcGlsZXItcGx1Z2luOmNvbXBpbGU8L2NvbXBpbGU+Ci0gICAgICAgICAgPHByb2Nlc3MtdGVzdC1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46dGVzdFJlc291cmNlczwvcHJvY2Vzcy10ZXN0LXJlc291cmNlcz4KLSAgICAgICAgICA8dGVzdC1jb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46dGVzdENvbXBpbGU8L3Rlc3QtY29tcGlsZT4KLSAgICAgICAgICA8dGVzdD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tc3VyZWZpcmUtcGx1Z2luOnRlc3Q8L3Rlc3Q+Ci0gICAgICAgICAgPHBhY2thZ2U+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWphci1wbHVnaW46amFyLCBvcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZzpqYmktbWF2ZW4tcGx1Z2luOmpiaS1jb21wb25lbnQ8L3BhY2thZ2U+Ci0gICAgICAgICAgPGluc3RhbGw+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWluc3RhbGwtcGx1Z2luOmluc3RhbGw8L2luc3RhbGw+Ci0gICAgICAgICAgPGRlcGxveT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZGVwbG95LXBsdWdpbjpkZXBsb3k8L2RlcGxveT4KLSAgICAgICAgPC9waGFzZXM+Ci0gICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgPC9jb21wb25lbnQ+Ci0gICAgPGNvbXBvbmVudD4KLSAgICAgIDxyb2xlPm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5BcnRpZmFjdEhhbmRsZXI8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PmpiaS1zZXJ2aWNlLXVuaXQ8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuRGVmYXVsdEFydGlmYWN0SGFuZGxlcjwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgPHR5cGU+amJpLXNlcnZpY2UtdW5pdDwvdHlwZT4KLSAgICAgICAgPGV4dGVuc2lvbj5qYXI8L2V4dGVuc2lvbj4KLSAgICAgICAgPGxhbmd1YWdlPmphdmE8L2xhbmd1YWdlPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkxpZmVjeWNsZU1hcHBpbmc8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PmpiaS1zZXJ2aWNlLXVuaXQ8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkRlZmF1bHRMaWZlY3ljbGVNYXBwaW5nPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8cGhhc2VzPgotICAgICAgICAgIDxwcm9jZXNzLWNsYXNzZXM+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc6amJpLW1hdmVuLXBsdWdpbjpnZW5lcmF0ZS1qYmktc2VydmljZS11bml0LWRlc2NyaXB0b3I8L3Byb2Nlc3MtY2xhc3Nlcz4KLSAgICAgICAgICA8cHJvY2Vzcy1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46cmVzb3VyY2VzLG9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nOmpiaS1tYXZlbi1wbHVnaW46Z2VuZXJhdGUtZGVwZW5kcy1maWxlPC9wcm9jZXNzLXJlc291cmNlcz4KLSAgICAgICAgICA8Y29tcGlsZT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tY29tcGlsZXItcGx1Z2luOmNvbXBpbGU8L2NvbXBpbGU+Ci0gICAgICAgICAgPHByb2Nlc3MtdGVzdC1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46dGVzdFJlc291cmNlczwvcHJvY2Vzcy10ZXN0LXJlc291cmNlcz4KLSAgICAgICAgICA8dGVzdC1jb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46dGVzdENvbXBpbGU8L3Rlc3QtY29tcGlsZT4KLSAgICAgICAgICA8dGVzdD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tc3VyZWZpcmUtcGx1Z2luOnRlc3Q8L3Rlc3Q+Ci0gICAgICAgICAgPHBhY2thZ2U+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWphci1wbHVnaW46amFyLG9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nOmpiaS1tYXZlbi1wbHVnaW46amJpLXNlcnZpY2UtdW5pdDwvcGFja2FnZT4KLSAgICAgICAgICA8aW5zdGFsbD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4taW5zdGFsbC1wbHVnaW46aW5zdGFsbDwvaW5zdGFsbD4KLSAgICAgICAgICA8ZGVwbG95Pm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1kZXBsb3ktcGx1Z2luOmRlcGxveTwvZGVwbG95PgotICAgICAgICA8L3BoYXNlcz4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkFydGlmYWN0SGFuZGxlcjwvcm9sZT4KLSAgICAgIDxyb2xlLWhpbnQ+amJpLXNlcnZpY2UtYXNzZW1ibHk8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuRGVmYXVsdEFydGlmYWN0SGFuZGxlcjwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgPHR5cGU+amJpLXNlcnZpY2UtYXNzZW1ibHk8L3R5cGU+Ci0gICAgICAgIDxleHRlbnNpb24+emlwPC9leHRlbnNpb24+Ci0gICAgICAgIDxsYW5ndWFnZT5qYXZhPC9sYW5ndWFnZT4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUubWFwcGluZy5MaWZlY3ljbGVNYXBwaW5nPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5qYmktc2VydmljZS1hc3NlbWJseTwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubWF2ZW4ubGlmZWN5Y2xlLm1hcHBpbmcuRGVmYXVsdExpZmVjeWNsZU1hcHBpbmc8L2ltcGxlbWVudGF0aW9uPgotICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxwaGFzZXM+Ci0gICAgICAgICAgPGdlbmVyYXRlLXJlc291cmNlcz5vcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZzpqYmktbWF2ZW4tcGx1Z2luOmdlbmVyYXRlLWpiaS1zZXJ2aWNlLWFzc2VtYmx5LWRlc2NyaXB0b3Isb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc6amJpLW1hdmVuLXBsdWdpbjpnZW5lcmF0ZS1kZXBlbmRzLWZpbGU8L2dlbmVyYXRlLXJlc291cmNlcz4KLSAgICAgICAgICA8cHJvY2Vzcy1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46cmVzb3VyY2VzPC9wcm9jZXNzLXJlc291cmNlcz4KLSAgICAgICAgICA8Y29tcGlsZT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tY29tcGlsZXItcGx1Z2luOmNvbXBpbGU8L2NvbXBpbGU+Ci0gICAgICAgICAgPHByb2Nlc3MtdGVzdC1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46dGVzdFJlc291cmNlczwvcHJvY2Vzcy10ZXN0LXJlc291cmNlcz4KLSAgICAgICAgICA8dGVzdC1jb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46dGVzdENvbXBpbGU8L3Rlc3QtY29tcGlsZT4KLSAgICAgICAgICA8dGVzdD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tc3VyZWZpcmUtcGx1Z2luOnRlc3Q8L3Rlc3Q+Ci0gICAgICAgICAgPHBhY2thZ2U+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc6amJpLW1hdmVuLXBsdWdpbjpqYmktc2VydmljZS1hc3NlbWJseTwvcGFja2FnZT4KLSAgICAgICAgICA8aW5zdGFsbD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4taW5zdGFsbC1wbHVnaW46aW5zdGFsbDwvaW5zdGFsbD4KLSAgICAgICAgICA8ZGVwbG95Pm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1kZXBsb3ktcGx1Z2luOmRlcGxveTwvZGVwbG95PgotICAgICAgICA8L3BoYXNlcz4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkFydGlmYWN0SGFuZGxlcjwvcm9sZT4KLSAgICAgIDxyb2xlLWhpbnQ+amJpLXNoYXJlZC1saWJyYXJ5PC9yb2xlLWhpbnQ+Ci0gICAgICA8aW1wbGVtZW50YXRpb24+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkRlZmF1bHRBcnRpZmFjdEhhbmRsZXI8L2ltcGxlbWVudGF0aW9uPgotICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDx0eXBlPmpiaS1zaGFyZWQtbGlicmFyeTwvdHlwZT4KLSAgICAgICAgPGV4dGVuc2lvbj5qYXI8L2V4dGVuc2lvbj4KLSAgICAgICAgPGxhbmd1YWdlPmphdmE8L2xhbmd1YWdlPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkxpZmVjeWNsZU1hcHBpbmc8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PmpiaS1zaGFyZWQtbGlicmFyeTwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubWF2ZW4ubGlmZWN5Y2xlLm1hcHBpbmcuRGVmYXVsdExpZmVjeWNsZU1hcHBpbmc8L2ltcGxlbWVudGF0aW9uPgotICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxwaGFzZXM+Ci0gICAgICAgICAgPGdlbmVyYXRlLXJlc291cmNlcz5vcmcuYXBhY2hlLnNlcnZpY2VtaXgudG9vbGluZzpqYmktbWF2ZW4tcGx1Z2luOmdlbmVyYXRlLWpiaS1zaGFyZWQtbGlicmFyeS1kZXNjcmlwdG9yLG9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nOmpiaS1tYXZlbi1wbHVnaW46Z2VuZXJhdGUtZGVwZW5kcy1maWxlPC9nZW5lcmF0ZS1yZXNvdXJjZXM+Ci0gICAgICAgICAgPHByb2Nlc3MtcmVzb3VyY2VzPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1yZXNvdXJjZXMtcGx1Z2luOnJlc291cmNlczwvcHJvY2Vzcy1yZXNvdXJjZXM+Ci0gICAgICAgICAgPGNvbXBpbGU+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWNvbXBpbGVyLXBsdWdpbjpjb21waWxlPC9jb21waWxlPgotICAgICAgICAgIDxwcm9jZXNzLXRlc3QtcmVzb3VyY2VzPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1yZXNvdXJjZXMtcGx1Z2luOnRlc3RSZXNvdXJjZXM8L3Byb2Nlc3MtdGVzdC1yZXNvdXJjZXM+Ci0gICAgICAgICAgPHRlc3QtY29tcGlsZT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tY29tcGlsZXItcGx1Z2luOnRlc3RDb21waWxlPC90ZXN0LWNvbXBpbGU+Ci0gICAgICAgICAgPHRlc3Q+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXN1cmVmaXJlLXBsdWdpbjp0ZXN0PC90ZXN0PgotICAgICAgICAgIDxwYWNrYWdlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1qYXItcGx1Z2luOmphciwKLSAgICAgICAgICAJCSAgIG9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nOmpiaS1tYXZlbi1wbHVnaW46amJpLXNoYXJlZC1saWJyYXJ5PC9wYWNrYWdlPgotICAgICAgICAgIDxpbnN0YWxsPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1pbnN0YWxsLXBsdWdpbjppbnN0YWxsPC9pbnN0YWxsPgotICAgICAgICAgIDxkZXBsb3k+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWRlcGxveS1wbHVnaW46ZGVwbG95PC9kZXBsb3k+Ci0gICAgICAgIDwvcGhhc2VzPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkxpZmVjeWNsZU1hcHBpbmc8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50Pml0ZXN0PC9yb2xlLWhpbnQ+Ci0gICAgICA8aW1wbGVtZW50YXRpb24+b3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUubWFwcGluZy5EZWZhdWx0TGlmZWN5Y2xlTWFwcGluZzwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgPHBoYXNlcz4KLSAgICAgICAgICA8Z2VuZXJhdGUtcmVzb3VyY2VzPm9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nOmpiaS1tYXZlbi1wbHVnaW46Z2VuZXJhdGUtZGVwZW5kcy1maWxlPC9nZW5lcmF0ZS1yZXNvdXJjZXM+Ci0gICAgICAgICAgPHByb2Nlc3MtcmVzb3VyY2VzPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1yZXNvdXJjZXMtcGx1Z2luOnJlc291cmNlczwvcHJvY2Vzcy1yZXNvdXJjZXM+Ci0gICAgICAgICAgPGNvbXBpbGU+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWNvbXBpbGVyLXBsdWdpbjpjb21waWxlPC9jb21waWxlPgotICAgICAgICAgIDxwcm9jZXNzLXRlc3QtcmVzb3VyY2VzPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1yZXNvdXJjZXMtcGx1Z2luOnRlc3RSZXNvdXJjZXM8L3Byb2Nlc3MtdGVzdC1yZXNvdXJjZXM+Ci0gICAgICAgICAgPHRlc3QtY29tcGlsZT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tY29tcGlsZXItcGx1Z2luOnRlc3RDb21waWxlPC90ZXN0LWNvbXBpbGU+Ci0gICAgICAgICAgPHRlc3Q+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXN1cmVmaXJlLXBsdWdpbjp0ZXN0PC90ZXN0PgotICAgICAgICAgIDxwYWNrYWdlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1qYXItcGx1Z2luOmphcjwvcGFja2FnZT4KLSAgICAgICAgICA8aW5zdGFsbD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4taW5zdGFsbC1wbHVnaW46aW5zdGFsbDwvaW5zdGFsbD4KLSAgICAgICAgICA8ZGVwbG95Pm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1kZXBsb3ktcGx1Z2luOmRlcGxveTwvZGVwbG95PgotICAgICAgICA8L3BoYXNlcz4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLQotPC9jb21wb25lbnRzPgotPC9jb21wb25lbnQtc2V0PgpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTZjYjkuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMgCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgIHVuZGVyIHRoZSAgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgIE9GIEFOWSBLSU5ELCBlaXRoZXIgIGV4cHJlc3MgIG9yCi0jIGltcGxpZWQuCi0jICAKLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIwotIyBUaGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHVzZWQgZHVyaW5nIHRlc3RzLi4KLSMKLWxvZzRqLnJvb3RMb2dnZXI9SU5GTywgc3Rkb3V0Ci0KLWxvZzRqLmxvZ2dlci5qYXZheC5qYmk9SU5GTwotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYWN0aXZlbXE9SU5GTwotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYWN0aXZlbXEuc3ByaW5nPVdBUk4KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmFjdGl2ZW1xLnN0b3JlLmpvdXJuYWw9SU5GTwotbG9nNGoubG9nZ2VyLm9yZy5hY3RpdmVpby5qb3VybmFsPUlORk8KLQotIyBDT05TT0xFIGFwcGVuZGVyIG5vdCB1c2VkIGJ5IGRlZmF1bHQKLWxvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyUtMTUuMTV0XSAlLTVwICUtMzAuMzBjezF9IC0gJW0lbgotCi0jIEZpbGUgYXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLm91dD1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIub3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLm91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyUtMTUuMTV0XSAlLTVwICUtMzAuMzBjezF9IC0gJW0lbgotbG9nNGouYXBwZW5kZXIub3V0LmZpbGU9dGFyZ2V0L3NlcnZpY2VtaXgubG9nCi1sb2c0ai5hcHBlbmRlci5vdXQuYXBwZW5kPXRydWUKZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL21haW4vc2NyaXB0cy9qYmkuYnVpbGQueG1sIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9zY3JpcHRzL2piaS5idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmFmYWQuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9zY3JpcHRzL2piaS5idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0tLT4KLTxwcm9qZWN0PgotCQotCTwhLS0KLQkKLQlDb21wb25lbnQgVGFza3MKLQkKLQktLT4KLQk8dGFyZ2V0IG5hbWU9Imluc3RhbGxDb21wb25lbnQiPgotCQk8dGFza2RlZiBuYW1lPSJpbnN0YWxsQ29tcG9uZW50IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLkluc3RhbGxDb21wb25lbnRUYXNrIiAvPgotCQk8ZWNobz5JbnN0YWxsaW5nICR7aW5zdGFsbGVyRmlsZX0gdG8gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8aW5zdGFsbENvbXBvbmVudCBzZXJ2ZXJQcm90b2NvbD0iJHtzZXJ2ZXJQcm90b2NvbH0iIGhvc3Q9IiR7aG9zdH0iIGNvbnRhaW5lck5hbWU9IiR7Y29udGFpbmVyTmFtZX0iIGpteERvbWFpbk5hbWU9IiR7am14RG9tYWluTmFtZX0iIHBvcnQ9IiR7cG9ydH0iIGpuZGlQYXRoPSIke2puZGlQYXRofSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iIGZhaWxPbkVycm9yPSJ0cnVlIiBmaWxlPSIke2luc3RhbGxlckZpbGV9Ii8+Ci0JPC90YXJnZXQ+CQotCQotCTx0YXJnZXQgbmFtZT0idW5pbnN0YWxsQ29tcG9uZW50Ij4KLQkJPHRhc2tkZWYgbmFtZT0idW5pbnN0YWxsQ29tcG9uZW50IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLlVuaW5zdGFsbENvbXBvbmVudFRhc2siIC8+Ci0JCTxlY2hvPlVuaW5zdGFsbGluZyAke2NvbXBvbmVudE5hbWV9IGZyb20gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8dW5pbnN0YWxsQ29tcG9uZW50IHNlcnZlclByb3RvY29sPSIke3NlcnZlclByb3RvY29sfSIgaG9zdD0iJHtob3N0fSIgY29udGFpbmVyTmFtZT0iJHtjb250YWluZXJOYW1lfSIgam14RG9tYWluTmFtZT0iJHtqbXhEb21haW5OYW1lfSIgcG9ydD0iJHtwb3J0fSIgam5kaVBhdGg9IiR7am5kaVBhdGh9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIgZmFpbE9uRXJyb3I9InRydWUiIG5hbWU9IiR7Y29tcG9uZW50TmFtZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InN0YXJ0Q29tcG9uZW50Ij4KLQkJPHRhc2tkZWYgbmFtZT0ic3RhcnRDb21wb25lbnQiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suU3RhcnRDb21wb25lbnRUYXNrIiAvPgotCQk8ZWNobz5TdGFydGluZyAke2NvbXBvbmVudE5hbWV9IG9uIHNlcnZpY2U6am14OiR7c2VydmVyUHJvdG9jb2x9Oi8vL2puZGkvJHtzZXJ2ZXJQcm90b2NvbH06Ly8ke2hvc3R9OiR7cG9ydH0ke2puZGlQYXRofTwvZWNobz4KLQkJPHN0YXJ0Q29tcG9uZW50IHNlcnZlclByb3RvY29sPSIke3NlcnZlclByb3RvY29sfSIgaG9zdD0iJHtob3N0fSIgY29udGFpbmVyTmFtZT0iJHtjb250YWluZXJOYW1lfSIgam14RG9tYWluTmFtZT0iJHtqbXhEb21haW5OYW1lfSIgcG9ydD0iJHtwb3J0fSIgam5kaVBhdGg9IiR7am5kaVBhdGh9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIgZmFpbE9uRXJyb3I9InRydWUiIG5hbWU9IiR7Y29tcG9uZW50TmFtZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InN0b3BDb21wb25lbnQiPgotCQk8dGFza2RlZiBuYW1lPSJzdG9wQ29tcG9uZW50IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLlN0b3BDb21wb25lbnRUYXNrIiAvPgotCQk8ZWNobz5TdG9wcGluZyAke2NvbXBvbmVudE5hbWV9IG9uIHNlcnZpY2U6am14OiR7c2VydmVyUHJvdG9jb2x9Oi8vL2puZGkvJHtzZXJ2ZXJQcm90b2NvbH06Ly8ke2hvc3R9OiR7cG9ydH0ke2puZGlQYXRofTwvZWNobz4KLQkJPHN0b3BDb21wb25lbnQgc2VydmVyUHJvdG9jb2w9IiR7c2VydmVyUHJvdG9jb2x9IiBob3N0PSIke2hvc3R9IiBjb250YWluZXJOYW1lPSIke2NvbnRhaW5lck5hbWV9IiBqbXhEb21haW5OYW1lPSIke2pteERvbWFpbk5hbWV9IiBwb3J0PSIke3BvcnR9IiBqbmRpUGF0aD0iJHtqbmRpUGF0aH0iIHVzZXJuYW1lPSIke3VzZXJuYW1lfSIgcGFzc3dvcmQ9IiR7cGFzc3dvcmR9IiBmYWlsT25FcnJvcj0idHJ1ZSIgbmFtZT0iJHtjb21wb25lbnROYW1lfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0ic2h1dGRvd25Db21wb25lbnQiPgotCQk8dGFza2RlZiBuYW1lPSJzaHV0ZG93bkNvbXBvbmVudCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLm1hbmFnZW1lbnQudGFzay5TaHV0RG93bkNvbXBvbmVudFRhc2siIC8+Ci0JCTxlY2hvPlNodXR0aW5nIGRvd24gJHtjb21wb25lbnROYW1lfSBvbiBzZXJ2aWNlOmpteDoke3NlcnZlclByb3RvY29sfTovLy9qbmRpLyR7c2VydmVyUHJvdG9jb2x9Oi8vJHtob3N0fToke3BvcnR9JHtqbmRpUGF0aH08L2VjaG8+Ci0JCTxzaHV0ZG93bkNvbXBvbmVudCBzZXJ2ZXJQcm90b2NvbD0iJHtzZXJ2ZXJQcm90b2NvbH0iIGhvc3Q9IiR7aG9zdH0iIGNvbnRhaW5lck5hbWU9IiR7Y29udGFpbmVyTmFtZX0iIGpteERvbWFpbk5hbWU9IiR7am14RG9tYWluTmFtZX0iIHBvcnQ9IiR7cG9ydH0iIGpuZGlQYXRoPSIke2puZGlQYXRofSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iIGZhaWxPbkVycm9yPSJ0cnVlIiBuYW1lPSIke2NvbXBvbmVudE5hbWV9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJsaXN0U2VydmljZUVuZ2luZXMiPgotCQk8dGFza2RlZiBuYW1lPSJsaXN0U2VydmljZUVuZ2luZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suTGlzdFNlcnZpY2VFbmdpbmVzVGFzayIgLz4KLQkJPGVjaG8+TGlzdGluZyBzZXJ2aWNlIGVuZ2luZXMgb24gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8bGlzdFNlcnZpY2VFbmdpbmVzIHNlcnZlclByb3RvY29sPSIke3NlcnZlclByb3RvY29sfSIgaG9zdD0iJHtob3N0fSIgY29udGFpbmVyTmFtZT0iJHtjb250YWluZXJOYW1lfSIgam14RG9tYWluTmFtZT0iJHtqbXhEb21haW5OYW1lfSIgcG9ydD0iJHtwb3J0fSIgam5kaVBhdGg9IiR7am5kaVBhdGh9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIgZmFpbE9uRXJyb3I9InRydWUiIHNlcnZpY2VBc3NlbWJseU5hbWU9IiR7c2VydmljZUFzc2VtYmx5TmFtZX0iIHNoYXJlZExpYnJhcnlOYW1lPSIke3NoYXJlZExpYnJhcnlOYW1lfSIgc3RhdGU9IiR7c3RhdGV9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJsaXN0QmluZGluZ0NvbXBvbmVudHMiPgotCQk8dGFza2RlZiBuYW1lPSJsaXN0QmluZGluZ0NvbXBvbmVudHMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suTGlzdEJpbmRpbmdDb21wb25lbnRzVGFzayIgLz4KLQkJPGVjaG8+TGlzdGluZyBiaW5kaW5nIGNvbXBvbmVudHMgb24gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8bGlzdEJpbmRpbmdDb21wb25lbnRzIHNlcnZlclByb3RvY29sPSIke3NlcnZlclByb3RvY29sfSIgaG9zdD0iJHtob3N0fSIgY29udGFpbmVyTmFtZT0iJHtjb250YWluZXJOYW1lfSIgam14RG9tYWluTmFtZT0iJHtqbXhEb21haW5OYW1lfSIgcG9ydD0iJHtwb3J0fSIgam5kaVBhdGg9IiR7am5kaVBhdGh9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIgZmFpbE9uRXJyb3I9InRydWUiIHNlcnZpY2VBc3NlbWJseU5hbWU9IiR7c2VydmljZUFzc2VtYmx5TmFtZX0iIGJpbmRpbmdDb21wb25lbnROYW1lPSIke2JpbmRpbmdDb21wb25lbnROYW1lfSIgc2hhcmVkTGlicmFyeU5hbWU9IiR7c2hhcmVkTGlicmFyeU5hbWV9IiBzdGF0ZT0iJHtzdGF0ZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tCi0KLQlTaGFyZWQgTGlicmFyeSBUYXNrcwotCQotCS0tPgotCTx0YXJnZXQgbmFtZT0iaW5zdGFsbFNoYXJlZExpYnJhcnkiPgotCQk8dGFza2RlZiBuYW1lPSJpbnN0YWxsU2hhcmVkTGlicmFyeSIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLm1hbmFnZW1lbnQudGFzay5JbnN0YWxsU2hhcmVkTGlicmFyeVRhc2siIC8+Ci0JCTxlY2hvPkluc3RhbGxpbmcgc2hhcmVkIGxpYnJhcnkgJHtzaGFyZWRMaWJyYXJ5RmlsZX0gb24gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8aW5zdGFsbFNoYXJlZExpYnJhcnkgc2VydmVyUHJvdG9jb2w9IiR7c2VydmVyUHJvdG9jb2x9IiBob3N0PSIke2hvc3R9IiBjb250YWluZXJOYW1lPSIke2NvbnRhaW5lck5hbWV9IiBqbXhEb21haW5OYW1lPSIke2pteERvbWFpbk5hbWV9IiBwb3J0PSIke3BvcnR9IiBqbmRpUGF0aD0iJHtqbmRpUGF0aH0iIHVzZXJuYW1lPSIke3VzZXJuYW1lfSIgcGFzc3dvcmQ9IiR7cGFzc3dvcmR9IiBmYWlsT25FcnJvcj0idHJ1ZSIgZmlsZT0iJHtzaGFyZWRMaWJyYXJ5RmlsZX0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuaW5zdGFsbFNoYXJlZExpYnJhcnkiPgotCQk8dGFza2RlZiBuYW1lPSJ1bmluc3RhbGxTaGFyZWRMaWJyYXJ5IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLlVuaW5zdGFsbFNoYXJlZExpYnJhcnlUYXNrIiAvPgotCQk8ZWNobz5Vbmluc3RhbGxpbmcgc2hhcmVkIGxpYnJhcnkgJHtzaGFyZWRMaWJyYXJ5TmFtZX0gb24gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8dW5pbnN0YWxsU2hhcmVkTGlicmFyeSBzZXJ2ZXJQcm90b2NvbD0iJHtzZXJ2ZXJQcm90b2NvbH0iIGhvc3Q9IiR7aG9zdH0iIGNvbnRhaW5lck5hbWU9IiR7Y29udGFpbmVyTmFtZX0iIGpteERvbWFpbk5hbWU9IiR7am14RG9tYWluTmFtZX0iIHBvcnQ9IiR7cG9ydH0iIGpuZGlQYXRoPSIke2puZGlQYXRofSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iIGZhaWxPbkVycm9yPSJ0cnVlIiBuYW1lPSIke3NoYXJlZExpYnJhcnlOYW1lfSIvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0ibGlzdFNoYXJlZExpYnJhcmllcyI+Ci0JCTx0YXNrZGVmIG5hbWU9Imxpc3RTaGFyZWRMaWJyYXJpZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suTGlzdFNoYXJlZExpYnJhcmllc1Rhc2siIC8+Ci0JCTxlY2hvPkxpc3Rpbmcgc2hhcmVkIGxpYnJhcnkgb24gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8bGlzdFNoYXJlZExpYnJhcmllcyBzZXJ2ZXJQcm90b2NvbD0iJHtzZXJ2ZXJQcm90b2NvbH0iIGhvc3Q9IiR7aG9zdH0iIGNvbnRhaW5lck5hbWU9IiR7Y29udGFpbmVyTmFtZX0iIGpteERvbWFpbk5hbWU9IiR7am14RG9tYWluTmFtZX0iIHBvcnQ9IiR7cG9ydH0iIGpuZGlQYXRoPSIke2puZGlQYXRofSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iIGZhaWxPbkVycm9yPSJ0cnVlIiBjb21wb25lbnROYW1lPSIke2NvbXBvbmVudE5hbWV9IiBzaGFyZWRMaWJyYXJ5TmFtZT0iJHtzaGFyZWRMaWJyYXJ5TmFtZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tCi0KLQlTaGFyZWQgTGlicmFyeSBUYXNrcwotCQotCS0tPgotCTx0YXJnZXQgbmFtZT0iZGVwbG95U2VydmljZUFzc2VtYmx5Ij4KLQkJPHRhc2tkZWYgbmFtZT0iZGVwbG95U2VydmljZUFzc2VtYmx5IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLkRlcGxveVNlcnZpY2VBc3NlbWJseVRhc2siIC8+Ci0JCTxlY2hvPkRlcGxveWluZyBzZXJ2aWNlIGFzc2VtYmx5ICR7c2VydmljZUFzc2VtYmx5RmlsZX0gb24gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8ZGVwbG95U2VydmljZUFzc2VtYmx5IHNlcnZlclByb3RvY29sPSIke3NlcnZlclByb3RvY29sfSIgaG9zdD0iJHtob3N0fSIgY29udGFpbmVyTmFtZT0iJHtjb250YWluZXJOYW1lfSIgam14RG9tYWluTmFtZT0iJHtqbXhEb21haW5OYW1lfSIgcG9ydD0iJHtwb3J0fSIgam5kaVBhdGg9IiR7am5kaVBhdGh9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIgZmFpbE9uRXJyb3I9InRydWUiIGZpbGU9IiR7c2VydmljZUFzc2VtYmx5RmlsZX0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95U2VydmljZUFzc2VtYmx5Ij4KLQkJPHRhc2tkZWYgbmFtZT0idW5kZXBsb3lTZXJ2aWNlQXNzZW1ibHkiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suVW5kZXBsb3lTZXJ2aWNlQXNzZW1ibHlUYXNrIiAvPgotCQk8ZWNobz5Vbmluc3RhbGxpbmcgc2VydmljZSBhc3NlbWJseSAke3NlcnZpY2VBc3NlbWJseU5hbWV9IG9uIHNlcnZpY2U6am14OiR7c2VydmVyUHJvdG9jb2x9Oi8vL2puZGkvJHtzZXJ2ZXJQcm90b2NvbH06Ly8ke2hvc3R9OiR7cG9ydH0ke2puZGlQYXRofTwvZWNobz4KLQkJPHVuZGVwbG95U2VydmljZUFzc2VtYmx5IHNlcnZlclByb3RvY29sPSIke3NlcnZlclByb3RvY29sfSIgaG9zdD0iJHtob3N0fSIgY29udGFpbmVyTmFtZT0iJHtjb250YWluZXJOYW1lfSIgam14RG9tYWluTmFtZT0iJHtqbXhEb21haW5OYW1lfSIgcG9ydD0iJHtwb3J0fSIgam5kaVBhdGg9IiR7am5kaVBhdGh9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIgZmFpbE9uRXJyb3I9InRydWUiIG5hbWU9IiR7c2VydmljZUFzc2VtYmx5TmFtZX0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InN0YXJ0U2VydmljZUFzc2VtYmx5Ij4KLQkJPHRhc2tkZWYgbmFtZT0ic3RhcnRTZXJ2aWNlQXNzZW1ibHkiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suU3RhcnRTZXJ2aWNlQXNzZW1ibHlUYXNrIiAvPgotCQk8ZWNobz5TdGFydGluZyBzZXJ2aWNlIGFzc2VtYmx5ICR7c2VydmljZUFzc2VtYmx5TmFtZX0gb24gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8c3RhcnRTZXJ2aWNlQXNzZW1ibHkgc2VydmVyUHJvdG9jb2w9IiR7c2VydmVyUHJvdG9jb2x9IiBob3N0PSIke2hvc3R9IiBjb250YWluZXJOYW1lPSIke2NvbnRhaW5lck5hbWV9IiBqbXhEb21haW5OYW1lPSIke2pteERvbWFpbk5hbWV9IiBwb3J0PSIke3BvcnR9IiBqbmRpUGF0aD0iJHtqbmRpUGF0aH0iIHVzZXJuYW1lPSIke3VzZXJuYW1lfSIgcGFzc3dvcmQ9IiR7cGFzc3dvcmR9IiBmYWlsT25FcnJvcj0idHJ1ZSIgbmFtZT0iJHtzZXJ2aWNlQXNzZW1ibHlOYW1lfSIvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0ic3RvcFNlcnZpY2VBc3NlbWJseSI+Ci0JCTx0YXNrZGVmIG5hbWU9InN0b3BTZXJ2aWNlQXNzZW1ibHkiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suU3RvcFNlcnZpY2VBc3NlbWJseVRhc2siIC8+Ci0JCTxlY2hvPlN0b3BwaW5nIHNlcnZpY2UgYXNzZW1ibHkgJHtzZXJ2aWNlQXNzZW1ibHlOYW1lfSBvbiBzZXJ2aWNlOmpteDoke3NlcnZlclByb3RvY29sfTovLy9qbmRpLyR7c2VydmVyUHJvdG9jb2x9Oi8vJHtob3N0fToke3BvcnR9JHtqbmRpUGF0aH08L2VjaG8+Ci0JCTxzdG9wU2VydmljZUFzc2VtYmx5IHNlcnZlclByb3RvY29sPSIke3NlcnZlclByb3RvY29sfSIgaG9zdD0iJHtob3N0fSIgY29udGFpbmVyTmFtZT0iJHtjb250YWluZXJOYW1lfSIgam14RG9tYWluTmFtZT0iJHtqbXhEb21haW5OYW1lfSIgcG9ydD0iJHtwb3J0fSIgam5kaVBhdGg9IiR7am5kaVBhdGh9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIgZmFpbE9uRXJyb3I9InRydWUiIG5hbWU9IiR7c2VydmljZUFzc2VtYmx5TmFtZX0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InNodXRkb3duU2VydmljZUFzc2VtYmx5Ij4KLQkJPHRhc2tkZWYgbmFtZT0ic2h1dGRvd25TZXJ2aWNlQXNzZW1ibHkiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suU2h1dERvd25TZXJ2aWNlQXNzZW1ibHlUYXNrIiAvPgotCQk8ZWNobz5TaHV0dGluZyBkb3duIHNlcnZpY2UgYXNzZW1ibHkgJHtzZXJ2aWNlQXNzZW1ibHlOYW1lfSBvbiBzZXJ2aWNlOmpteDoke3NlcnZlclByb3RvY29sfTovLy9qbmRpLyR7c2VydmVyUHJvdG9jb2x9Oi8vJHtob3N0fToke3BvcnR9JHtqbmRpUGF0aH08L2VjaG8+Ci0JCTxzaHV0ZG93blNlcnZpY2VBc3NlbWJseSBzZXJ2ZXJQcm90b2NvbD0iJHtzZXJ2ZXJQcm90b2NvbH0iIGhvc3Q9IiR7aG9zdH0iIGNvbnRhaW5lck5hbWU9IiR7Y29udGFpbmVyTmFtZX0iIGpteERvbWFpbk5hbWU9IiR7am14RG9tYWluTmFtZX0iIHBvcnQ9IiR7cG9ydH0iIGpuZGlQYXRoPSIke2puZGlQYXRofSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iIGZhaWxPbkVycm9yPSJ0cnVlIiBuYW1lPSIke3NlcnZpY2VBc3NlbWJseU5hbWV9Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJsaXN0U2VydmljZUFzc2VtYmxpZXMiPgotCQk8dGFza2RlZiBuYW1lPSJsaXN0U2VydmljZUFzc2VtYmxpZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmpiaS5tYW5hZ2VtZW50LnRhc2suTGlzdFNlcnZpY2VBc3NlbWJsaWVzVGFzayIgLz4KLQkJPGVjaG8+TGlzdGluZyBzZXJ2aWNlIGFzc2VtYmxpZXMgb24gc2VydmljZTpqbXg6JHtzZXJ2ZXJQcm90b2NvbH06Ly8vam5kaS8ke3NlcnZlclByb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fSR7am5kaVBhdGh9PC9lY2hvPgotCQk8bGlzdFNlcnZpY2VBc3NlbWJsaWVzIHNlcnZlclByb3RvY29sPSIke3NlcnZlclByb3RvY29sfSIgaG9zdD0iJHtob3N0fSIgY29udGFpbmVyTmFtZT0iJHtjb250YWluZXJOYW1lfSIgam14RG9tYWluTmFtZT0iJHtqbXhEb21haW5OYW1lfSIgcG9ydD0iJHtwb3J0fSIgam5kaVBhdGg9IiR7am5kaVBhdGh9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIgZmFpbE9uRXJyb3I9InRydWUiIGNvbXBvbmVudE5hbWU9IiR7Y29tcG9uZW50TmFtZX0iIHNlcnZpY2VBc3NlbWJseU5hbWU9IiR7c2VydmljZUFzc2VtYmx5TmFtZX0iIHN0YXRlPSIke3N0YXRlfSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9zY3JpcHRzL2piaS5tb2pvcy54bWwgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3NjcmlwdHMvamJpLm1vam9zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5NTk1Zi4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3NjcmlwdHMvamJpLm1vam9zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0tLT4KLTxwbHVnaW5NZXRhZGF0YT4KLSAgPG1vam9zPgotICAgIDxtb2pvPgotICAgICAgPGdvYWw+aW5zdGFsbENvbXBvbmVudDwvZ29hbD4KLSAgICAgIDxjYWxsPmluc3RhbGxDb21wb25lbnQ8L2NhbGw+ICAgICAgCi0gICAgICA8cmVxdWlyZXNQcm9qZWN0PnRydWU8L3JlcXVpcmVzUHJvamVjdD4gICAgICAKLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgSW5zdGFsbHMgYSBKQkkgY29tcG9uZW50IHRvIGEgc2VydmVyCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHBhcmFtZXRlcnM+ICAgICAgICAgIAotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmluc3RhbGxlckZpbGU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5pbnN0YWxsZXJGaWxlPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn0taW5zdGFsbGVyLnppcDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcG9uZW50IGluc3RhbGxlciBmaWxlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c2VydmVyUHJvdG9jb2w8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zZXJ2ZXJQcm90b2NvbDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRlZmF1bHQgcHJvdGNvbCB1c2VkIGZvciBjb25uZWN0aW5nIHdpdGggdGhlIFNlcnZpY2VNaXggSk1YIE1CZWFuU2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+aG9zdDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5Pmhvc3Q8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPmxvY2FsaG9zdDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBob3N0bmFtZSBvZiB0aGUgbmFtaW5nIHNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmNvbnRhaW5lck5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5jb250YWluZXJOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5TZXJ2aWNlTWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lciB0byBjb25uZWN0IHRvPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am14RG9tYWluTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpteERvbWFpbk5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPm9yZy5hcGFjaGUuc2VydmljZW1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkb21haW4gbmFtZSBvZiB0aGUgTUJlYW5TZXJ2ZXIgdXNlZCBieSB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cG9ydDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBvcnQ8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjEwOTk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcG9ydCB0aGUgbmFtaW5nIHNlcnZlciBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpuZGlQYXRoPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am5kaVBhdGg8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPi9qbXhybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGF0aCBpbiB0aGUgbmFtaW5nIHNlcnZlciB0byByZXRyaWV2ZSB0aGUgSk1YIENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT51c2VybmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnVzZXJuYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgdXNlciBuYW1lIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBhc3N3b3JkPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cGFzc3dvcmQ8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXNzd29yZCBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgIDwvcGFyYW1ldGVycz4KLSAgICA8L21vam8+Ci0gICAgPG1vam8+Ci0gICAgICA8Z29hbD51bmluc3RhbGxDb21wb25lbnQ8L2dvYWw+Ci0gICAgICA8Y2FsbD51bmluc3RhbGxDb21wb25lbnQ8L2NhbGw+ICAgICAgCi0gICAgICA8cmVxdWlyZXNQcm9qZWN0PnRydWU8L3JlcXVpcmVzUHJvamVjdD4gICAgICAKLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVW5pbnN0YWxsZWQgYSBKQkkgY29tcG9uZW50IGZyb20gdGhlIHNlcnZlcgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxwYXJhbWV0ZXJzPiAgICAgICAgICAKLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5jb21wb25lbnROYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+Y29tcG9uZW50TmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgQ29tcG9uZW50IHRvIHVuaW5zdGFsbDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNlcnZlclByb3RvY29sPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2VydmVyUHJvdG9jb2w8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb3Rjb2wgdXNlZCBmb3IgY29ubmVjdGluZyB3aXRoIHRoZSBTZXJ2aWNlTWl4IEpNWCBNQmVhblNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmhvc3Q8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5ob3N0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5sb2NhbGhvc3Q8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgaG9zdG5hbWUgb2YgdGhlIG5hbWluZyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5jb250YWluZXJOYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+Y29udGFpbmVyTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+U2VydmljZU1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXIgdG8gY29ubmVjdCB0bzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpteERvbWFpbk5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbXhEb21haW5OYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5vcmcuYXBhY2hlLnNlcnZpY2VtaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZG9tYWluIG5hbWUgb2YgdGhlIE1CZWFuU2VydmVyIHVzZWQgYnkgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBvcnQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wb3J0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4xMDk5PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBvcnQgdGhlIG5hbWluZyBzZXJ2ZXIgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMgb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbmRpUGF0aDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpuZGlQYXRoPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4vam14cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhdGggaW4gdGhlIG5hbWluZyBzZXJ2ZXIgdG8gcmV0cmlldmUgdGhlIEpNWCBDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+dXNlcm5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT51c2VybmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHVzZXIgbmFtZSBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wYXNzd29yZDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBhc3N3b3JkPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGFzc3dvcmQgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICA8L3BhcmFtZXRlcnM+Ci0gICAgPC9tb2pvPgotICAgIDxtb2pvPgotICAgICAgPGdvYWw+c3RvcENvbXBvbmVudDwvZ29hbD4KLSAgICAgIDxjYWxsPnN0b3BDb21wb25lbnQ8L2NhbGw+ICAgICAgCi0gICAgICA8cmVxdWlyZXNQcm9qZWN0PnRydWU8L3JlcXVpcmVzUHJvamVjdD4gICAgICAKLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU3RvcHMgYSBKQkkgY29tcG9uZW50IG9uIHRoZSBzZXJ2ZXIKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8cGFyYW1ldGVycz4gICAgICAgICAgCi0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29tcG9uZW50TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbXBvbmVudE5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIENvbXBvbmVudCB0byB1bmluc3RhbGw8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2ZXJQcm90b2NvbDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZlclByb3RvY29sPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5ybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBwcm90Y29sIHVzZWQgZm9yIGNvbm5lY3Rpbmcgd2l0aCB0aGUgU2VydmljZU1peCBKTVggTUJlYW5TZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5ob3N0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+aG9zdDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+bG9jYWxob3N0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGhvc3RuYW1lIG9mIHRoZSBuYW1pbmcgc2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29udGFpbmVyTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbnRhaW5lck5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPlNlcnZpY2VNaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyIHRvIGNvbm5lY3QgdG88L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbXhEb21haW5OYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am14RG9tYWluTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBNQmVhblNlcnZlciB1c2VkIGJ5IHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wb3J0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cG9ydDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MTA5OTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwb3J0IHRoZSBuYW1pbmcgc2VydmVyIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am5kaVBhdGg8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbmRpUGF0aDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+L2pteHJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXRoIGluIHRoZSBuYW1pbmcgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBKTVggQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnVzZXJuYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+dXNlcm5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1c2VyIG5hbWUgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cGFzc3dvcmQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wYXNzd29yZDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhc3N3b3JkIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgPC9wYXJhbWV0ZXJzPgotICAgIDwvbW9qbz4KLSAgICA8bW9qbz4KLSAgICAgIDxnb2FsPnN0YXJ0Q29tcG9uZW50PC9nb2FsPgotICAgICAgPGNhbGw+c3RhcnRDb21wb25lbnQ8L2NhbGw+ICAgICAgCi0gICAgICA8cmVxdWlyZXNQcm9qZWN0PnRydWU8L3JlcXVpcmVzUHJvamVjdD4gICAgICAKLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU3RhcnRzIGEgSkJJIGNvbXBvbmVudCBvbiB0aGUgc2VydmVyCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHBhcmFtZXRlcnM+ICAgICAgICAgIAotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmNvbXBvbmVudE5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5jb21wb25lbnROYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBDb21wb25lbnQgdG8gdW5pbnN0YWxsPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c2VydmVyUHJvdG9jb2w8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zZXJ2ZXJQcm90b2NvbDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRlZmF1bHQgcHJvdGNvbCB1c2VkIGZvciBjb25uZWN0aW5nIHdpdGggdGhlIFNlcnZpY2VNaXggSk1YIE1CZWFuU2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+aG9zdDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5Pmhvc3Q8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPmxvY2FsaG9zdDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBob3N0bmFtZSBvZiB0aGUgbmFtaW5nIHNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmNvbnRhaW5lck5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5jb250YWluZXJOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5TZXJ2aWNlTWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lciB0byBjb25uZWN0IHRvPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am14RG9tYWluTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpteERvbWFpbk5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPm9yZy5hcGFjaGUuc2VydmljZW1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkb21haW4gbmFtZSBvZiB0aGUgTUJlYW5TZXJ2ZXIgdXNlZCBieSB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cG9ydDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBvcnQ8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjEwOTk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcG9ydCB0aGUgbmFtaW5nIHNlcnZlciBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpuZGlQYXRoPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am5kaVBhdGg8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPi9qbXhybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGF0aCBpbiB0aGUgbmFtaW5nIHNlcnZlciB0byByZXRyaWV2ZSB0aGUgSk1YIENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT51c2VybmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnVzZXJuYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgdXNlciBuYW1lIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBhc3N3b3JkPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cGFzc3dvcmQ8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXNzd29yZCBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgIDwvcGFyYW1ldGVycz4KLSAgICA8L21vam8+Ci0gICAgPG1vam8+Ci0gICAgICA8Z29hbD5zaHV0ZG93bkNvbXBvbmVudDwvZ29hbD4KLSAgICAgIDxjYWxsPnNodXRkb3duQ29tcG9uZW50PC9jYWxsPiAgICAgIAotICAgICAgPHJlcXVpcmVzUHJvamVjdD50cnVlPC9yZXF1aXJlc1Byb2plY3Q+ICAgICAgCi0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFNodXRzIGRvd24gYSBKQkkgY29tcG9uZW50IG9uIHRoZSBzZXJ2ZXIKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8cGFyYW1ldGVycz4gICAgICAgICAgCi0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29tcG9uZW50TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbXBvbmVudE5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIENvbXBvbmVudCB0byBzaHV0IGRvd248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2ZXJQcm90b2NvbDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZlclByb3RvY29sPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5ybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBwcm90Y29sIHVzZWQgZm9yIGNvbm5lY3Rpbmcgd2l0aCB0aGUgU2VydmljZU1peCBKTVggTUJlYW5TZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5ob3N0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+aG9zdDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+bG9jYWxob3N0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGhvc3RuYW1lIG9mIHRoZSBuYW1pbmcgc2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29udGFpbmVyTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbnRhaW5lck5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPlNlcnZpY2VNaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyIHRvIGNvbm5lY3QgdG88L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbXhEb21haW5OYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am14RG9tYWluTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBNQmVhblNlcnZlciB1c2VkIGJ5IHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wb3J0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cG9ydDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MTA5OTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwb3J0IHRoZSBuYW1pbmcgc2VydmVyIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am5kaVBhdGg8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbmRpUGF0aDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+L2pteHJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXRoIGluIHRoZSBuYW1pbmcgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBKTVggQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnVzZXJuYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+dXNlcm5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1c2VyIG5hbWUgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cGFzc3dvcmQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wYXNzd29yZDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhc3N3b3JkIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgPC9wYXJhbWV0ZXJzPgotICAgIDwvbW9qbz4KLSAgICA8bW9qbz4KLSAgICAgIDxnb2FsPmxpc3RTZXJ2aWNlRW5naW5lczwvZ29hbD4KLSAgICAgIDxjYWxsPmxpc3RTZXJ2aWNlRW5naW5lczwvY2FsbD4gICAgICAKLSAgICAgIDxyZXF1aXJlc1Byb2plY3Q+dHJ1ZTwvcmVxdWlyZXNQcm9qZWN0PiAgICAgIAotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBMaXN0cyB0aGUgc2VydmljZSBlbmdpbmVzIG9uIHRoZSBzZXJ2ZXIsIHByb3ZpZGUgZWl0aGVyIGEgc2VydmljZUFzc2VtYmx5TmFtZSwgc2VydmljZUVuZ2luZU5hbWUsIHNoYXJlZExpYnJhcnlOYW1lIG9yIHN0YXRlCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHBhcmFtZXRlcnM+ICAgICAgICAgIAotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNlcnZpY2VBc3NlbWJseU5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zZXJ2aWNlQXNzZW1ibHlOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT48L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5MaXN0IHNlcnZpY2UgZW5naW5lcyB0aGF0IGhhdmUgc2VydmljZSB1bml0cyBmcm9tIHRoZSBnaXZlbiBzZXJ2aWNlIGFzc2VtYmx5IGRlcGxveWVkIHRvIHRoZW08L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4gICAgICAgIAotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNoYXJlZExpYnJhcnlOYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2hhcmVkTGlicmFyeU5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPkxpc3QgdGhlIHNlcnZpY2UgZW5naW5lcyB1c2luZyB0aGUgZ2l2ZW4gc2hhcmVkIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zdGF0ZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnN0YXRlPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT48L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5SZXBvcnQgc2VydmljZSBhc3NlbWJsaWVzIGluIHRoZSBnaXZlbiBzdGF0ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNlcnZlclByb3RvY29sPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2VydmVyUHJvdG9jb2w8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb3Rjb2wgdXNlZCBmb3IgY29ubmVjdGluZyB3aXRoIHRoZSBTZXJ2aWNlTWl4IEpNWCBNQmVhblNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmhvc3Q8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5ob3N0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5sb2NhbGhvc3Q8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgaG9zdG5hbWUgb2YgdGhlIG5hbWluZyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5jb250YWluZXJOYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+Y29udGFpbmVyTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+U2VydmljZU1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXIgdG8gY29ubmVjdCB0bzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpteERvbWFpbk5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbXhEb21haW5OYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5vcmcuYXBhY2hlLnNlcnZpY2VtaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZG9tYWluIG5hbWUgb2YgdGhlIE1CZWFuU2VydmVyIHVzZWQgYnkgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBvcnQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wb3J0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4xMDk5PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBvcnQgdGhlIG5hbWluZyBzZXJ2ZXIgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMgb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbmRpUGF0aDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpuZGlQYXRoPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4vam14cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhdGggaW4gdGhlIG5hbWluZyBzZXJ2ZXIgdG8gcmV0cmlldmUgdGhlIEpNWCBDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+dXNlcm5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT51c2VybmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHVzZXIgbmFtZSBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wYXNzd29yZDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBhc3N3b3JkPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGFzc3dvcmQgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICA8L3BhcmFtZXRlcnM+Ci0gICAgPC9tb2pvPgotICAgIDxtb2pvPgotICAgICAgPGdvYWw+bGlzdEJpbmRpbmdDb21wb25lbnRzPC9nb2FsPgotICAgICAgPGNhbGw+bGlzdEJpbmRpbmdDb21wb25lbnRzPC9jYWxsPiAgICAgIAotICAgICAgPHJlcXVpcmVzUHJvamVjdD50cnVlPC9yZXF1aXJlc1Byb2plY3Q+ICAgICAgCi0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIExpc3RzIHRoZSBiaW5kaW5nIGNvbXBvbmVudHMgb24gdGhlIHNlcnZlciwgcHJvdmlkZSBlaXRoZXIgYSBiaW5kaW5nQ29tcG9uZW50TmFtZSwgc2VydmljZUFzc2VtYmx5TmFtZSwgc2hhcmVkTGlicmFyeU5hbWUgb3Igc3RhdGUKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8cGFyYW1ldGVycz4gICAgICAgICAgCi0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+YmluZGluZ0NvbXBvbmVudE5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5iaW5kaW5nQ29tcG9uZW50TmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+TGlzdCBvbmx5IHRoZSBnaXZlbiBiaW5kaW5nIGNvbXBvbmVudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNlcnZpY2VBc3NlbWJseU5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zZXJ2aWNlQXNzZW1ibHlOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT48L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5MaXN0IGJpbmRpbmcgY29tcG9uZW50cyB0aGF0IGhhdmUgc2VydmljZSB1bml0cyBmcm9tIHRoZSBnaXZlbiBzZXJ2aWNlIGFzc2VtYmx5IGRlcGxveWVkIHRvIHRoZW08L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zaGFyZWRMaWJyYXJ5TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNoYXJlZExpYnJhcnlOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT48L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5MaXN0IHRoZSBzZXJ2aWNlIGVuZ2luZXMgdXNpbmcgdGhlIGdpdmVuIHNoYXJlZCBsaWJyYXJ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c3RhdGU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zdGF0ZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+UmVwb3J0IHNlcnZpY2UgYXNzZW1ibGllcyBpbiB0aGUgZ2l2ZW4gc3RhdGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2ZXJQcm90b2NvbDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZlclByb3RvY29sPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5ybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBwcm90Y29sIHVzZWQgZm9yIGNvbm5lY3Rpbmcgd2l0aCB0aGUgU2VydmljZU1peCBKTVggTUJlYW5TZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5ob3N0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+aG9zdDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+bG9jYWxob3N0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGhvc3RuYW1lIG9mIHRoZSBuYW1pbmcgc2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29udGFpbmVyTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbnRhaW5lck5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPlNlcnZpY2VNaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyIHRvIGNvbm5lY3QgdG88L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbXhEb21haW5OYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am14RG9tYWluTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBNQmVhblNlcnZlciB1c2VkIGJ5IHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wb3J0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cG9ydDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MTA5OTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwb3J0IHRoZSBuYW1pbmcgc2VydmVyIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am5kaVBhdGg8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbmRpUGF0aDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+L2pteHJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXRoIGluIHRoZSBuYW1pbmcgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBKTVggQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnVzZXJuYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+dXNlcm5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1c2VyIG5hbWUgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cGFzc3dvcmQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wYXNzd29yZDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhc3N3b3JkIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgPC9wYXJhbWV0ZXJzPgotICAgIDwvbW9qbz4KLSAgICA8bW9qbz4KLSAgICAgIDxnb2FsPmluc3RhbGxTaGFyZWRMaWJyYXJ5PC9nb2FsPgotICAgICAgPGNhbGw+aW5zdGFsbFNoYXJlZExpYnJhcnk8L2NhbGw+ICAgICAgCi0gICAgICA8cmVxdWlyZXNQcm9qZWN0PnRydWU8L3JlcXVpcmVzUHJvamVjdD4gICAgICAKLSAgICAgIDxkZXNjcmlwdGlvbj4KLQkJCUluc3RhbGxzIGEgc2hhcmVkIGxpYnJhcnkKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8cGFyYW1ldGVycz4gICAgICAgICAgCi0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c2hhcmVkTGlicmFyeUZpbGU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zaGFyZWRMaWJyYXJ5RmlsZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LnppcDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBsb2NhdGlvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNlcnZlclByb3RvY29sPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2VydmVyUHJvdG9jb2w8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb3Rjb2wgdXNlZCBmb3IgY29ubmVjdGluZyB3aXRoIHRoZSBTZXJ2aWNlTWl4IEpNWCBNQmVhblNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmhvc3Q8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5ob3N0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5sb2NhbGhvc3Q8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgaG9zdG5hbWUgb2YgdGhlIG5hbWluZyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5jb250YWluZXJOYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+Y29udGFpbmVyTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+U2VydmljZU1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXIgdG8gY29ubmVjdCB0bzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpteERvbWFpbk5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbXhEb21haW5OYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5vcmcuYXBhY2hlLnNlcnZpY2VtaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZG9tYWluIG5hbWUgb2YgdGhlIE1CZWFuU2VydmVyIHVzZWQgYnkgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBvcnQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wb3J0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4xMDk5PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBvcnQgdGhlIG5hbWluZyBzZXJ2ZXIgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMgb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbmRpUGF0aDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpuZGlQYXRoPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4vam14cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhdGggaW4gdGhlIG5hbWluZyBzZXJ2ZXIgdG8gcmV0cmlldmUgdGhlIEpNWCBDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+dXNlcm5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT51c2VybmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHVzZXIgbmFtZSBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wYXNzd29yZDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBhc3N3b3JkPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGFzc3dvcmQgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICA8L3BhcmFtZXRlcnM+Ci0gICAgPC9tb2pvPgotICAgIDxtb2pvPgotICAgICAgPGdvYWw+dW5pbnN0YWxsU2hhcmVkTGlicmFyeTwvZ29hbD4KLSAgICAgIDxjYWxsPnVuaW5zdGFsbFNoYXJlZExpYnJhcnk8L2NhbGw+ICAgICAgCi0gICAgICA8cmVxdWlyZXNQcm9qZWN0PnRydWU8L3JlcXVpcmVzUHJvamVjdD4gICAgICAKLSAgICAgIDxkZXNjcmlwdGlvbj4KLQkJCVVuaW5zdGFsbHMgYSBzaGFyZWQgbGlicmFyeQotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxwYXJhbWV0ZXJzPiAgICAgICAgICAKLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zaGFyZWRMaWJyYXJ5TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNoYXJlZExpYnJhcnlOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeSB0byB1bmluc3RhbGw8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2ZXJQcm90b2NvbDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZlclByb3RvY29sPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5ybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBwcm90Y29sIHVzZWQgZm9yIGNvbm5lY3Rpbmcgd2l0aCB0aGUgU2VydmljZU1peCBKTVggTUJlYW5TZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5ob3N0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+aG9zdDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+bG9jYWxob3N0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGhvc3RuYW1lIG9mIHRoZSBuYW1pbmcgc2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29udGFpbmVyTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbnRhaW5lck5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPlNlcnZpY2VNaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyIHRvIGNvbm5lY3QgdG88L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbXhEb21haW5OYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am14RG9tYWluTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBNQmVhblNlcnZlciB1c2VkIGJ5IHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wb3J0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cG9ydDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MTA5OTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwb3J0IHRoZSBuYW1pbmcgc2VydmVyIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am5kaVBhdGg8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbmRpUGF0aDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+L2pteHJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXRoIGluIHRoZSBuYW1pbmcgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBKTVggQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnVzZXJuYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+dXNlcm5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1c2VyIG5hbWUgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cGFzc3dvcmQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wYXNzd29yZDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhc3N3b3JkIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgPC9wYXJhbWV0ZXJzPgotICAgIDwvbW9qbz4KLSAgICA8bW9qbz4KLSAgICAgIDxnb2FsPmxpc3RTaGFyZWRMaWJyYXJpZXM8L2dvYWw+Ci0gICAgICA8Y2FsbD5saXN0U2hhcmVkTGlicmFyaWVzPC9jYWxsPiAgICAgIAotICAgICAgPHJlcXVpcmVzUHJvamVjdD50cnVlPC9yZXF1aXJlc1Byb2plY3Q+ICAgICAgCi0gICAgICA8ZGVzY3JpcHRpb24+Ci0JCQlMaXN0cyB0aGUgY3VycmVudGx5IGRlcGxveWVkIHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8cGFyYW1ldGVycz4gICAgICAgICAgCi0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29tcG9uZW50TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbXBvbmVudE5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPkxpc3Qgc2hhcmVkIGxpYnJhcmllcyB0aGF0IHRoZSBjb21wb25lbnQgZGVwZW5kcyBvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNoYXJlZExpYnJhcnlOYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2hhcmVkTGlicmFyeU5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPkxpc3Qgb25seSB0aGUgZ2l2ZW4gc2hhcmVkIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2ZXJQcm90b2NvbDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZlclByb3RvY29sPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5ybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBwcm90Y29sIHVzZWQgZm9yIGNvbm5lY3Rpbmcgd2l0aCB0aGUgU2VydmljZU1peCBKTVggTUJlYW5TZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5ob3N0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+aG9zdDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+bG9jYWxob3N0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGhvc3RuYW1lIG9mIHRoZSBuYW1pbmcgc2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29udGFpbmVyTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbnRhaW5lck5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPlNlcnZpY2VNaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyIHRvIGNvbm5lY3QgdG88L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbXhEb21haW5OYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am14RG9tYWluTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBNQmVhblNlcnZlciB1c2VkIGJ5IHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wb3J0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cG9ydDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MTA5OTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwb3J0IHRoZSBuYW1pbmcgc2VydmVyIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am5kaVBhdGg8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbmRpUGF0aDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+L2pteHJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXRoIGluIHRoZSBuYW1pbmcgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBKTVggQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnVzZXJuYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+dXNlcm5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1c2VyIG5hbWUgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cGFzc3dvcmQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wYXNzd29yZDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhc3N3b3JkIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgPC9wYXJhbWV0ZXJzPgotICAgIDwvbW9qbz4KLSAgICA8bW9qbz4KLSAgICAgIDxnb2FsPmRlcGxveVNlcnZpY2VBc3NlbWJseTwvZ29hbD4KLSAgICAgIDxjYWxsPmRlcGxveVNlcnZpY2VBc3NlbWJseTwvY2FsbD4gICAgICAKLSAgICAgIDxyZXF1aXJlc1Byb2plY3Q+dHJ1ZTwvcmVxdWlyZXNQcm9qZWN0PiAgICAgIAotICAgICAgPGRlc2NyaXB0aW9uPgotCQkJRGVwbG95cyBhIHNlcnZpY2UgYXNzZW1ibHkgdG8gdGhlIHNlcnZlcgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxwYXJhbWV0ZXJzPiAgICAgICAgICAKLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2aWNlQXNzZW1ibHlGaWxlPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2VydmljZUFzc2VtYmx5RmlsZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LmphcjwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBsb2NhdGlvbiBvZiB0aGUgc2VydmljZSBhc3NlbWJseSBpbnN0YWxsZXIgZmlsZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNlcnZlclByb3RvY29sPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2VydmVyUHJvdG9jb2w8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb3Rjb2wgdXNlZCBmb3IgY29ubmVjdGluZyB3aXRoIHRoZSBTZXJ2aWNlTWl4IEpNWCBNQmVhblNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmhvc3Q8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5ob3N0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5sb2NhbGhvc3Q8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgaG9zdG5hbWUgb2YgdGhlIG5hbWluZyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5jb250YWluZXJOYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+Y29udGFpbmVyTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+U2VydmljZU1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXIgdG8gY29ubmVjdCB0bzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpteERvbWFpbk5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbXhEb21haW5OYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5vcmcuYXBhY2hlLnNlcnZpY2VtaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZG9tYWluIG5hbWUgb2YgdGhlIE1CZWFuU2VydmVyIHVzZWQgYnkgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBvcnQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wb3J0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4xMDk5PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBvcnQgdGhlIG5hbWluZyBzZXJ2ZXIgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMgb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbmRpUGF0aDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpuZGlQYXRoPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4vam14cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhdGggaW4gdGhlIG5hbWluZyBzZXJ2ZXIgdG8gcmV0cmlldmUgdGhlIEpNWCBDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+dXNlcm5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT51c2VybmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHVzZXIgbmFtZSBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wYXNzd29yZDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBhc3N3b3JkPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGFzc3dvcmQgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICA8L3BhcmFtZXRlcnM+Ci0gICAgPC9tb2pvPgotICAgIDxtb2pvPgotICAgICAgPGdvYWw+dW5kZXBsb3lTZXJ2aWNlQXNzZW1ibHk8L2dvYWw+Ci0gICAgICA8Y2FsbD51bmRlcGxveVNlcnZpY2VBc3NlbWJseTwvY2FsbD4gICAgICAKLSAgICAgIDxyZXF1aXJlc1Byb2plY3Q+dHJ1ZTwvcmVxdWlyZXNQcm9qZWN0PiAgICAgIAotICAgICAgPGRlc2NyaXB0aW9uPgotCQkJVW5kZXBsb3lzIGEgc2VydmljZSBhc3NlbWJseSBmcm9tIHRoZSBzZXJ2ZXIKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8cGFyYW1ldGVycz4gICAgICAgICAgCi0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c2VydmljZUFzc2VtYmx5TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZpY2VBc3NlbWJseU5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgYXNzZW1ibHk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2ZXJQcm90b2NvbDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZlclByb3RvY29sPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5ybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBwcm90Y29sIHVzZWQgZm9yIGNvbm5lY3Rpbmcgd2l0aCB0aGUgU2VydmljZU1peCBKTVggTUJlYW5TZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5ob3N0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+aG9zdDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+bG9jYWxob3N0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGhvc3RuYW1lIG9mIHRoZSBuYW1pbmcgc2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29udGFpbmVyTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbnRhaW5lck5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPlNlcnZpY2VNaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyIHRvIGNvbm5lY3QgdG88L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbXhEb21haW5OYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am14RG9tYWluTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBNQmVhblNlcnZlciB1c2VkIGJ5IHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wb3J0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cG9ydDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MTA5OTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwb3J0IHRoZSBuYW1pbmcgc2VydmVyIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am5kaVBhdGg8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbmRpUGF0aDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+L2pteHJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXRoIGluIHRoZSBuYW1pbmcgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBKTVggQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnVzZXJuYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+dXNlcm5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1c2VyIG5hbWUgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cGFzc3dvcmQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wYXNzd29yZDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhc3N3b3JkIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgPC9wYXJhbWV0ZXJzPgotICAgIDwvbW9qbz4KLSAgICA8bW9qbz4KLSAgICAgIDxnb2FsPnN0YXJ0U2VydmljZUFzc2VtYmx5PC9nb2FsPgotICAgICAgPGNhbGw+c3RhcnRTZXJ2aWNlQXNzZW1ibHk8L2NhbGw+ICAgICAgCi0gICAgICA8cmVxdWlyZXNQcm9qZWN0PnRydWU8L3JlcXVpcmVzUHJvamVjdD4gICAgICAKLSAgICAgIDxkZXNjcmlwdGlvbj4KLQkJCVN0YXJ0cyBhIHNlcnZpY2UgYXNzZW1ibHkgZnJvbSB0aGUgc2VydmVyCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHBhcmFtZXRlcnM+ICAgICAgICAgIAotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNlcnZpY2VBc3NlbWJseU5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zZXJ2aWNlQXNzZW1ibHlOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGFzc2VtYmx5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c2VydmVyUHJvdG9jb2w8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zZXJ2ZXJQcm90b2NvbDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRlZmF1bHQgcHJvdGNvbCB1c2VkIGZvciBjb25uZWN0aW5nIHdpdGggdGhlIFNlcnZpY2VNaXggSk1YIE1CZWFuU2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+aG9zdDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5Pmhvc3Q8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPmxvY2FsaG9zdDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBob3N0bmFtZSBvZiB0aGUgbmFtaW5nIHNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmNvbnRhaW5lck5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5jb250YWluZXJOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5TZXJ2aWNlTWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lciB0byBjb25uZWN0IHRvPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am14RG9tYWluTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpteERvbWFpbk5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPm9yZy5hcGFjaGUuc2VydmljZW1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkb21haW4gbmFtZSBvZiB0aGUgTUJlYW5TZXJ2ZXIgdXNlZCBieSB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cG9ydDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBvcnQ8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjEwOTk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcG9ydCB0aGUgbmFtaW5nIHNlcnZlciBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpuZGlQYXRoPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am5kaVBhdGg8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPi9qbXhybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGF0aCBpbiB0aGUgbmFtaW5nIHNlcnZlciB0byByZXRyaWV2ZSB0aGUgSk1YIENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT51c2VybmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnVzZXJuYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgdXNlciBuYW1lIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBhc3N3b3JkPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cGFzc3dvcmQ8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXNzd29yZCBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgIDwvcGFyYW1ldGVycz4KLSAgICA8L21vam8+Ci0gICAgPG1vam8+Ci0gICAgICA8Z29hbD5zdG9wU2VydmljZUFzc2VtYmx5PC9nb2FsPgotICAgICAgPGNhbGw+c3RvcFNlcnZpY2VBc3NlbWJseTwvY2FsbD4gICAgICAKLSAgICAgIDxyZXF1aXJlc1Byb2plY3Q+dHJ1ZTwvcmVxdWlyZXNQcm9qZWN0PiAgICAgIAotICAgICAgPGRlc2NyaXB0aW9uPgotCQkJU3RvcHMgYSBzZXJ2aWNlIGFzc2VtYmx5IGZyb20gdGhlIHNlcnZlcgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxwYXJhbWV0ZXJzPiAgICAgICAgICAKLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2aWNlQXNzZW1ibHlOYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2VydmljZUFzc2VtYmx5TmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgc2VydmljZSBhc3NlbWJseTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnNlcnZlclByb3RvY29sPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c2VydmVyUHJvdG9jb2w8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IHByb3Rjb2wgdXNlZCBmb3IgY29ubmVjdGluZyB3aXRoIHRoZSBTZXJ2aWNlTWl4IEpNWCBNQmVhblNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmhvc3Q8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5ob3N0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5sb2NhbGhvc3Q8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgaG9zdG5hbWUgb2YgdGhlIG5hbWluZyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5jb250YWluZXJOYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+Y29udGFpbmVyTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+U2VydmljZU1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXIgdG8gY29ubmVjdCB0bzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpteERvbWFpbk5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbXhEb21haW5OYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5vcmcuYXBhY2hlLnNlcnZpY2VtaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZG9tYWluIG5hbWUgb2YgdGhlIE1CZWFuU2VydmVyIHVzZWQgYnkgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBvcnQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wb3J0PC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4xMDk5PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBvcnQgdGhlIG5hbWluZyBzZXJ2ZXIgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMgb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbmRpUGF0aDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpuZGlQYXRoPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4vam14cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhdGggaW4gdGhlIG5hbWluZyBzZXJ2ZXIgdG8gcmV0cmlldmUgdGhlIEpNWCBDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+dXNlcm5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT51c2VybmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHVzZXIgbmFtZSBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wYXNzd29yZDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBhc3N3b3JkPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGFzc3dvcmQgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICA8L3BhcmFtZXRlcnM+Ci0gICAgPC9tb2pvPgotICAgIDxtb2pvPgotICAgICAgPGdvYWw+c2h1dGRvd25TZXJ2aWNlQXNzZW1ibHk8L2dvYWw+Ci0gICAgICA8Y2FsbD5zaHV0ZG93blNlcnZpY2VBc3NlbWJseTwvY2FsbD4gICAgICAKLSAgICAgIDxyZXF1aXJlc1Byb2plY3Q+dHJ1ZTwvcmVxdWlyZXNQcm9qZWN0PiAgICAgIAotICAgICAgPGRlc2NyaXB0aW9uPgotCQkJU2h1dHNkb3duIGEgc2VydmljZSBhc3NlbWJseSBmcm9tIHRoZSBzZXJ2ZXIKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8cGFyYW1ldGVycz4gICAgICAgICAgCi0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c2VydmljZUFzc2VtYmx5TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZpY2VBc3NlbWJseU5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgYXNzZW1ibHk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5zZXJ2ZXJQcm90b2NvbDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZlclByb3RvY29sPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5ybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBwcm90Y29sIHVzZWQgZm9yIGNvbm5lY3Rpbmcgd2l0aCB0aGUgU2VydmljZU1peCBKTVggTUJlYW5TZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5ob3N0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+aG9zdDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+bG9jYWxob3N0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGhvc3RuYW1lIG9mIHRoZSBuYW1pbmcgc2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29udGFpbmVyTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbnRhaW5lck5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPlNlcnZpY2VNaXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyIHRvIGNvbm5lY3QgdG88L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5qbXhEb21haW5OYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am14RG9tYWluTmFtZTwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBNQmVhblNlcnZlciB1c2VkIGJ5IHRoZSBTZXJ2aWNlTWl4IEpCSSBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT5wb3J0PC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cG9ydDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MTA5OTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwb3J0IHRoZSBuYW1pbmcgc2VydmVyIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am5kaVBhdGg8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5qbmRpUGF0aDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+L2pteHJtaTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXRoIGluIHRoZSBuYW1pbmcgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBKTVggQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnVzZXJuYW1lPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+dXNlcm5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB1c2VyIG5hbWUgZm9yIHRoZSBKTVhDb25uZWN0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cGFzc3dvcmQ8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5wYXNzd29yZDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+c214PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHBhc3N3b3JkIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgPC9wYXJhbWV0ZXJzPgotICAgIDwvbW9qbz4KLSAgICA8bW9qbz4KLSAgICAgIDxnb2FsPmxpc3RTZXJ2aWNlQXNzZW1ibGllczwvZ29hbD4KLSAgICAgIDxjYWxsPmxpc3RTZXJ2aWNlQXNzZW1ibGllczwvY2FsbD4gICAgICAKLSAgICAgIDxyZXF1aXJlc1Byb2plY3Q+dHJ1ZTwvcmVxdWlyZXNQcm9qZWN0PiAgICAgIAotICAgICAgPGRlc2NyaXB0aW9uPgotCQkJTGlzdHMgdGhlIHNlcnZpY2UgYXNzZW1ibGllcyBmcm9tIHRoZSBzZXJ2ZXIKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8cGFyYW1ldGVycz4gICAgICAgICAgCi0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+Y29tcG9uZW50TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmNvbXBvbmVudE5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPkxpc3QgdGhlIHNlcnZpY2UgYXNzZW1ibGllcyB0aGF0IGhhcyBzZXJ2aWNlIHVuaXRzIGRlcGxveWVkIHRvIHRoaXMgY29tcG9uZW50PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c2VydmljZUFzc2VtYmx5TmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnNlcnZpY2VBc3NlbWJseU5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPkxpc3Qgb25seSB0aGUgZ2l2ZW4gc2VydmljZSBhc3NlbWJseTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnN0YXRlPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+c3RhdGU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlJlcG9ydCBzZXJ2aWNlIGFzc2VtYmxpZXMgaW4gdGhlIGdpdmVuIHN0YXRlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+c2VydmVyUHJvdG9jb2w8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5zZXJ2ZXJQcm90b2NvbDwvcHJvcGVydHk+Ci0gICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8cmVhZG9ubHk+ZmFsc2U8L3JlYWRvbmx5PgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+cm1pPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGRlZmF1bHQgcHJvdGNvbCB1c2VkIGZvciBjb25uZWN0aW5nIHdpdGggdGhlIFNlcnZpY2VNaXggSk1YIE1CZWFuU2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+aG9zdDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5Pmhvc3Q8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPmxvY2FsaG9zdDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBob3N0bmFtZSBvZiB0aGUgbmFtaW5nIHNlcnZlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmNvbnRhaW5lck5hbWU8L25hbWU+IAotICAgICAgICAgIDxwcm9wZXJ0eT5jb250YWluZXJOYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5TZXJ2aWNlTWl4PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIFNlcnZpY2VNaXggSkJJIENvbnRhaW5lciB0byBjb25uZWN0IHRvPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+am14RG9tYWluTmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PmpteERvbWFpbk5hbWU8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPm9yZy5hcGFjaGUuc2VydmljZW1peDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBkb21haW4gbmFtZSBvZiB0aGUgTUJlYW5TZXJ2ZXIgdXNlZCBieSB0aGUgU2VydmljZU1peCBKQkkgQ29udGFpbmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgPG5hbWU+cG9ydDwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnBvcnQ8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjEwOTk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcG9ydCB0aGUgbmFtaW5nIHNlcnZlciBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPmpuZGlQYXRoPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+am5kaVBhdGg8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPi9qbXhybWk8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgcGF0aCBpbiB0aGUgbmFtaW5nIHNlcnZlciB0byByZXRyaWV2ZSB0aGUgSk1YIENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlcj4KLSAgICAgICAgICA8bmFtZT51c2VybmFtZTwvbmFtZT4gCi0gICAgICAgICAgPHByb3BlcnR5PnVzZXJuYW1lPC9wcm9wZXJ0eT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxyZWFkb25seT5mYWxzZTwvcmVhZG9ubHk+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5zbXg8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgdXNlciBuYW1lIGZvciB0aGUgSk1YQ29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgIDxuYW1lPnBhc3N3b3JkPC9uYW1lPiAKLSAgICAgICAgICA8cHJvcGVydHk+cGFzc3dvcmQ8L3Byb3BlcnR5PgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHJlYWRvbmx5PmZhbHNlPC9yZWFkb25seT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnNteDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBwYXNzd29yZCBmb3IgdGhlIEpNWENvbm5lY3Rpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgIDwvcGFyYW1ldGVycz4KLSAgICA8L21vam8+Ci0gIDwvbW9qb3M+Ci08L3BsdWdpbk1ldGFkYXRhPgpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0Fic3RyYWN0RGVwbG95YWJsZU1vam9UZXN0LmphdmEgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvQWJzdHJhY3REZXBsb3lhYmxlTW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhMGU4Yy4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvQWJzdHJhY3REZXBsb3lhYmxlTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNlcnZpY2VtaXguamJpLmZyYW1ld29yay5BZG1pbkNvbW1hbmRzU2VydmljZU1CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuc2VydmljZW1peC5qYmkubWFuYWdlbWVudC50YXNrLkpiaVRhc2s7Ci0KLS8qKgotICogVGVzdCBjYXNlcyBmb3Ige0BsaW5rIEFic3RyYWN0RGVwbG95YWJsZU1vam99Ci0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdERlcGxveWFibGVNb2pvVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUlORVJfTkFNRSA9ICJzb21lQ29udGFpbmVyTmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAic29tZUhvc3ROYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk5ESV9QQVRIID0gInNvbWVKbmRpUGF0aCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpNWF9ET01BSU5fTkFNRSA9ICJzb21lSm14RG9tYWluTmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInNvbWVQYXNzd29yZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBQT1JUID0gMTAwMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1BST1RPQ09MID0gInNvbWVQcm90b2NvbE5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1VSTCA9ICJzb21lU2VydmljZVVybCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJOQU1FID0gInNvbWVVc2VyTmFtZSI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZUFudFRhc2soKSB7Ci0gICAgICAgIEpiaVRhc2sgdGFzayA9IG5ldyBKYmlUYXNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoQWRtaW5Db21tYW5kc1NlcnZpY2VNQmVhbiBhZG1pbkNvbW1hbmRzU2VydmljZU1CZWFuKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAvL2dyYWNpb3VzbHkgZG8gbm90aGluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBBYnN0cmFjdERlcGxveWFibGVNb2pvIG1vam8gPSBuZXcgQWJzdHJhY3REZXBsb3lhYmxlTW9qbygpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIC8vZ3JhY2lvdXNseSBkbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbW9qby5jb250YWluZXJOYW1lID0gQ09OVEFJTkVSX05BTUU7Ci0gICAgICAgIG1vam8uZW52aXJvbm1lbnQgPSAic29tZUVudmlyb25tZW50S2V5PXNvbWVFbnZpcm9ubWVudFZhbHVlIjsKLSAgICAgICAgbW9qby5ob3N0ID0gSE9TVDsKLSAgICAgICAgbW9qby5qbmRpUGF0aCA9IEpORElfUEFUSDsKLSAgICAgICAgbW9qby5qbXhEb21haW5OYW1lID0gSk1YX0RPTUFJTl9OQU1FOwotICAgICAgICBtb2pvLnBhc3N3b3JkID0gUEFTU1dPUkQ7Ci0gICAgICAgIG1vam8ucG9ydCA9IFBPUlQudG9TdHJpbmcoKTsKLSAgICAgICAgbW9qby5zZXJ2ZXJQcm90b2NvbCA9IFNFUlZFUl9QUk9UT0NPTDsKLSAgICAgICAgbW9qby5zZXJ2aWNlVXJsID0gU0VSVklDRV9VUkw7Ci0gICAgICAgIG1vam8udXNlcm5hbWUgPSBVU0VSTkFNRTsKLQotICAgICAgICBtb2pvLmluaXRpYWxpemVKYmlUYXNrKHRhc2spOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJJbml0aWFsaXphdGlvbiBzaG91bGQgaGF2ZSBpbmplY3RlZCB0aGUgQW50IHByb2plY3QiLCB0YXNrLmdldFByb2plY3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDT05UQUlORVJfTkFNRSwgdGFzay5nZXRDb250YWluZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSE9TVCwgdGFzay5nZXRIb3N0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSk5ESV9QQVRILCB0YXNrLmdldEpuZGlQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSk1YX0RPTUFJTl9OQU1FLCB0YXNrLmdldEpteERvbWFpbk5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQQVNTV09SRCwgdGFzay5nZXRQYXNzd29yZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBPUlQsIChJbnRlZ2VyKSB0YXNrLmdldFBvcnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTRVJWRVJfUFJPVE9DT0wsIHRhc2suZ2V0U2VydmVyUHJvdG9jb2woKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTRVJWSUNFX1VSTCwgdGFzay5nZXRTZXJ2aWNlVXJsKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoVVNFUk5BTUUsIHRhc2suZ2V0VXNlcm5hbWUoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvRGVwZW5kZW5jeUluZm9ybWF0aW9uVGVzdC5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0RlcGVuZGVuY3lJbmZvcm1hdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzZGMzOS4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9qYmkvRGVwZW5kZW5jeUluZm9ybWF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IGNhc2VzIGZvciB7QGxpbmsgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmkuRGVwZW5kZW5jeUluZm9ybWF0aW9ufQotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUluZm9ybWF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1NoYXJlZExpYnJhcnkoKSB7Ci0gICAgICAgIERlcGVuZGVuY3lJbmZvcm1hdGlvbiBkZXAgPSBuZXcgRGVwZW5kZW5jeUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgZGVwLnNldFR5cGUoImphciIpOwotICAgICAgICBhc3NlcnRGYWxzZShkZXAuaXNTaGFyZWRMaWJyYXJ5KCkpOwotCi0gICAgICAgIGRlcC5zZXRUeXBlKERlcGVuZGVuY3lJbmZvcm1hdGlvbi5TSEFSRURfTElCUkFSWV9UWVBFKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkZXAuaXNTaGFyZWRMaWJyYXJ5KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlDb21wb25lbnREZXNjcmlwdG9yV3JpdGVyVGVzdC5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaUNvbXBvbmVudERlc2NyaXB0b3JXcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYWRjMWEuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaUNvbXBvbmVudERlc2NyaXB0b3JXcml0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmpiaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9yeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBUZXN0IGNhc2VzIGZvciB7QGxpbmsgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5qYmkuSmJpQ29tcG9uZW50RGVzY3JpcHRvcldyaXRlcn0KLSAqLwotcHVibGljIGNsYXNzIEpiaUNvbXBvbmVudERlc2NyaXB0b3JXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMS4wIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5hbWVzcGFjZUNvbnRleHQgTkFNRVNQQUNFUyA9IG5ldyBOYW1lc3BhY2VDb250ZXh0KCkgewotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamJpIjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgICAgIHJldHVybiAiamJpIjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVmaXhlcyhTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgiamJpIikuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIEpiaUNvbXBvbmVudERlc2NyaXB0b3JXcml0ZXIgd3JpdGVyOwotICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgIHByaXZhdGUgWFBhdGhGYWN0b3J5IGZhY3RvcnkgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgd3JpdGVyID0gbmV3IEpiaUNvbXBvbmVudERlc2NyaXB0b3JXcml0ZXIoR2VuZXJhdGVDb21wb25lbnREZXNjcmlwdG9yTW9qby5VVEZfOCk7Ci0gICAgICAgIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKGdldENsYXNzKCkuZ2V0TmFtZSgpLCAiLnhtbCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0KLSAgICAgICAgaWYgKCFmaWxlLmRlbGV0ZSgpKSB7Ci0gICAgICAgICAgICBmaWxlLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8RGVwZW5kZW5jeUluZm9ybWF0aW9uPiBkZXBzID0gbmV3IEFycmF5TGlzdDxEZXBlbmRlbmN5SW5mb3JtYXRpb24+KCk7Ci0gICAgICAgIGRlcHMuYWRkKGNyZWF0ZUphckRlcGVuZGVuY3koInNpbXBsZS1qYXIiLCAibGliL3NpbXBsZS1qYXIuamFyIikpOwotICAgICAgICBkZXBzLmFkZChjcmVhdGVTaGFyZWRMaWJyYXJ5RGVwZW5kZW5jeSgic2ltcGxlLXNsIikpOwotCi0gICAgICAgIHdyaXRlci53cml0ZShmaWxlLAotICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuc2VydmljZW1peC50ZXN0LkNvbXBvbmVudCIsCi0gICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRlc3QuQm9vdHN0cmFwIiwKLSAgICAgICAgICAgICAgICAgICAgICJiaW5kaW5nLWNvbXBvbmVudCIsCi0gICAgICAgICAgICAgICAgICAgICAic2VydmljZW1peC10ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlTWl4IDo6IEEgVGVzdCBDb21wb25lbnQiLAotICAgICAgICAgICAgICAgICAgICAgInBhcmVudC1maXJzdCIsCi0gICAgICAgICAgICAgICAgICAgICAicGFyZW50LWZpcnN0IiwKLSAgICAgICAgICAgICAgICAgICAgIGRlcHMpOwotCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgU0wgaW4gdGhlIHNoYXJlZC1saWJyYXJ5IGVsZW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAgInNpbXBsZS1zbCIsIHhwYXRoKCIvamJpOmpiaS9qYmk6Y29tcG9uZW50L2piaTpzaGFyZWQtbGlicmFyeSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjAiLCB4cGF0aCgiL2piaTpqYmkvamJpOmNvbXBvbmVudC9qYmk6c2hhcmVkLWxpYnJhcnkvQHZlcnNpb24iKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJPbmx5IHRoZSBKQVIgc2hvdWxkIGJlIG9uIHRoZSBjb21wb25lbnQtY2xhc3MtcGF0aCIsICIxIiwKLSAgICAgICAgICAgICAgICAgICAgIHhwYXRoKCJjb3VudCgvamJpOmpiaS9qYmk6Y29tcG9uZW50L2piaTpjb21wb25lbnQtY2xhc3MtcGF0aC9qYmk6cGF0aC1lbGVtZW50KSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaWIvc2ltcGxlLWphci5qYXIiLAotICAgICAgICAgICAgICAgICAgICAgeHBhdGgoIi9qYmk6amJpL2piaTpjb21wb25lbnQvamJpOmNvbXBvbmVudC1jbGFzcy1wYXRoL2piaTpwYXRoLWVsZW1lbnQiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeHBhdGgoU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBYUGF0aCB4cGF0aCA9IGZhY3RvcnkubmV3WFBhdGgoKTsKLSAgICAgICAgeHBhdGguc2V0TmFtZXNwYWNlQ29udGV4dChOQU1FU1BBQ0VTKTsKLQotICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotCi0gICAgICAgIHJldHVybiB4cGF0aC5ldmFsdWF0ZShleHByZXNzaW9uLCBzb3VyY2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGVwZW5kZW5jeUluZm9ybWF0aW9uIGNyZWF0ZUphckRlcGVuZGVuY3koU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBEZXBlbmRlbmN5SW5mb3JtYXRpb24gZGVwID0gY3JlYXRlRGVwZW5kZW5jeShuYW1lLCAiamFyIik7Ci0gICAgICAgIGRlcC5zZXRGaWxlbmFtZShmaWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBkZXA7Ci0gICAgfSAgICAKLQotICAgIHByaXZhdGUgRGVwZW5kZW5jeUluZm9ybWF0aW9uIGNyZWF0ZVNoYXJlZExpYnJhcnlEZXBlbmRlbmN5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEZXBlbmRlbmN5KG5hbWUsIERlcGVuZGVuY3lJbmZvcm1hdGlvbi5TSEFSRURfTElCUkFSWV9UWVBFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlcGVuZGVuY3lJbmZvcm1hdGlvbiBjcmVhdGVEZXBlbmRlbmN5KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgewotICAgICAgICBEZXBlbmRlbmN5SW5mb3JtYXRpb24gZGVwID0gbmV3IERlcGVuZGVuY3lJbmZvcm1hdGlvbigpOwotICAgICAgICBkZXAuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgZGVwLnNldFR5cGUodHlwZSk7Ci0gICAgICAgIGRlcC5zZXRWZXJzaW9uKFZFUlNJT04pOwotICAgICAgICByZXR1cm4gZGVwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlTZXJ2aWNlRmlsZUFuYWx5emVyVGVzdC5qYXZhIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVNlcnZpY2VGaWxlQW5hbHl6ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NDFiOWIuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVNlcnZpY2VGaWxlQW5hbHl6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmNvbW1vbi5wYWNrYWdpbmcuQ29uc3VtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmNvbW1vbi5wYWNrYWdpbmcuUHJvdmlkZXM7Ci0KLS8qKgotICogVGVzdCBjYXNlIHRvIGV4ZXJjaXNlIHRoZSBkZWZhdWx0IHNlcnZpY2UgZmlsZSBhbmFseXplciB3aGljaCB1c2VzIGEKLSAqIHNlcnZpY2UueG1sIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYmlTZXJ2aWNlRmlsZUFuYWx5emVyVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBTRVJWSUNFU19GSUxFID0gbmV3IEZpbGUoIi4vc3JjL3Rlc3QvcmVzb3VyY2VzL2piaS1zZXJ2aWNlcy54bWwiKTsKLQotICAgIC8qKgotICAgICAqIFNpbXBsZSB0ZXN0IHRvIHJldHJpZXZlIGFuZCBwYXJzZSBhIGpiaS1zZXJ2aWNlcy54bWwgZmlsZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlU2VydmljZXNYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmJpU2VydmljZUZpbGVBbmFseXplciBhbmFseXplciA9IG5ldyBKYmlTZXJ2aWNlRmlsZUFuYWx5emVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoImFuYWx5emVyIHNob3VsZCBub3QgYmUgbnVsbCIsIGFuYWx5emVyKTsKLQotICAgICAgICBhbmFseXplci5zZXRKYmlTZXJ2aWNlc0ZpbGUoU0VSVklDRVNfRklMRSk7Ci0gICAgICAgIExpc3Q8Q29uc3VtZXM+IGNvbnN1bWVzID0gYW5hbHl6ZXIuZ2V0Q29uc3VtZXMoKTsKLSAgICAgICAgTGlzdDxQcm92aWRlcz4gcHJvdmlkZXMgPSBhbmFseXplci5nZXRQcm92aWRlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDb25zdW1lcyBMaXN0IHNob3VsZCBub3QgYmUgbnVsbCIsIGNvbnN1bWVzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUHJvdmlkZXMgTGlzdCBzaG91bGQgbm90IGJlIG51bGwiLCBwcm92aWRlcyk7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBFbXB0eSBjb25zdW1lcyBsaXN0IiwgY29uc3VtZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlByb3ZpZGVzIExpc3Qgc2hvdWxkIG5vdCBiZSBlbXB0eSIsIHByb3ZpZGVzLmlzRW1wdHkoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVNlcnZpY2VVbml0RGVzY3JpcHRvcldyaXRlclRlc3QuamF2YSBiL2piaS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2piaS9KYmlTZXJ2aWNlVW5pdERlc2NyaXB0b3JXcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjQ5ZTIuLjAwMDAwMDAKLS0tIGEvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vamJpL0piaVNlcnZpY2VVbml0RGVzY3JpcHRvcldyaXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4uamJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmNvbW1vbi5wYWNrYWdpbmcuQ29uc3VtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zZXJ2aWNlbWl4LmNvbW1vbi5wYWNrYWdpbmcuUHJvdmlkZXM7Ci0KLXB1YmxpYyBjbGFzcyBKYmlTZXJ2aWNlVW5pdERlc2NyaXB0b3JXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1VURjggPSAiVVRGLTgiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1VURjE2ID0gIlVURi0xNiI7Ci0KLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19JU084ODU5MSA9ICJJU08tODg1OS0xIjsKLQotICAgIC8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0lTTzg4NTkyID0gIklTTy04ODU5LTIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpCSV9OQU1FU1BBQ0UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamJpIjsKLQotICAgIC8vIFRPRE86IGhvdyB0byBmZXRjaCB0aGUgYnVpbGQgZGlyZWN0b3J5ICgnLi90YXJnZXQnKSBmcm9tIE1hdmVuIHByb3BlcnR5PwotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlZERlc2NyaXB0b3JMb2NhdGlvbiA9ICIuL3RhcmdldC90ZXN0LW91dHB1dHMiOwotCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgdGhpcy5vdXRwdXREaXIgPSBuZXcgRmlsZShnZW5lcmF0ZWREZXNjcmlwdG9yTG9jYXRpb24pOwotICAgICAgICBpZiAoIXRoaXMub3V0cHV0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aGlzLm91dHB1dERpci5ta2RpcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVVEY4RW5jb2RpbmdXcml0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIGRlc2NyaXB0b3IgPSBuZXcgRmlsZShvdXRwdXREaXIsICJqYmktc3UtVVRGOC54bWwiKTsKLQotICAgICAgICBTdHJpbmcgeG1sRW5jb2RpbmcgPSBFTkNPRElOR19VVEY4OwotICAgICAgICB3cml0ZURlc2NyaXB0b3IoZGVzY3JpcHRvciwgeG1sRW5jb2RpbmcpOwotICAgICAgICB2ZXJpZnlEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHhtbEVuY29kaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VVRGMTZFbmNvZGluZ1dyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZGVzY3JpcHRvciA9IG5ldyBGaWxlKG91dHB1dERpciwgImpiaS1zdS1VVEYxNi54bWwiKTsKLQotICAgICAgICBTdHJpbmcgeG1sRW5jb2RpbmcgPSBFTkNPRElOR19VVEYxNjsKLSAgICAgICAgd3JpdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHhtbEVuY29kaW5nKTsKLSAgICAgICAgdmVyaWZ5RGVzY3JpcHRvcihkZXNjcmlwdG9yLCB4bWxFbmNvZGluZyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBwdWJsaWMgdm9pZCB0ZXN0SVNPODg1OTFFbmNvZGluZ1dyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IEZpbGUKLSAgICAgKiBkZXNjcmlwdG9yID0gbmV3IEZpbGUob3V0cHV0RGlyLCAiamJpLXN1LUlTTzg4NTkxLnhtbCIpOwotICAgICAqIAotICAgICAqIFN0cmluZyB4bWxFbmNvZGluZyA9IEVOQ09ESU5HX0lTTzg4NTkxOyB3cml0ZURlc2NyaXB0b3IoZGVzY3JpcHRvciwKLSAgICAgKiB4bWxFbmNvZGluZyk7IHZlcmlmeURlc2NyaXB0b3IoZGVzY3JpcHRvciwgeG1sRW5jb2RpbmcpOyB9Ci0gICAgICogCi0gICAgICogcHVibGljIHZvaWQgdGVzdElTTzg4NTkyRW5jb2RpbmdXcml0ZSgpIHRocm93cyBFeGNlcHRpb24geyBGaWxlCi0gICAgICogZGVzY3JpcHRvciA9IG5ldyBGaWxlKG91dHB1dERpciwgImpiaS1zdS1JU084ODU5Mi54bWwiKTsKLSAgICAgKiAKLSAgICAgKiBTdHJpbmcgeG1sRW5jb2RpbmcgPSBFTkNPRElOR19JU084ODU5Mjsgd3JpdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IsCi0gICAgICogeG1sRW5jb2RpbmcpOyB2ZXJpZnlEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHhtbEVuY29kaW5nKTsgfQotICAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRGVzY3JpcHRvcihGaWxlIGRlc2NyaXB0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSmJpUGx1Z2luRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBjb25zdW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBwcm92aWRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QuY29tL2VuY29kaW5nIiwgImFiY+Xk9iIpOwotCi0gICAgICAgIENvbnN1bWVzIG5ld0NvbnN1bWVzID0gbmV3IENvbnN1bWVzKCk7Ci0gICAgICAgIG5ld0NvbnN1bWVzLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgbmV3Q29uc3VtZXMuc2V0RW5kcG9pbnROYW1lKCJjb25zdW1lcuXk9iIpOwotICAgICAgICBjb25zdW1lcy5hZGQobmV3Q29uc3VtZXMpOwotCi0gICAgICAgIFByb3ZpZGVzIG5ld1Byb3ZpZGVzID0gbmV3IFByb3ZpZGVzKCk7Ci0gICAgICAgIG5ld1Byb3ZpZGVzLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgbmV3UHJvdmlkZXMuc2V0RW5kcG9pbnROYW1lKCJwcm92aWRlcuXk9iIpOwotICAgICAgICBwcm92aWRlcy5hZGQobmV3UHJvdmlkZXMpOwotCi0gICAgICAgIEpiaVNlcnZpY2VVbml0RGVzY3JpcHRvcldyaXRlciB3cml0ZXIgPSBuZXcgSmJpU2VydmljZVVuaXREZXNjcmlwdG9yV3JpdGVyKAotICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKGRlc2NyaXB0b3IsIGZhbHNlLCAibmFtZSIsICJkZXNjcmlwdGlvbiIsIG5ldyBBcnJheUxpc3QoKSwKLSAgICAgICAgICAgICAgICBjb25zdW1lcywgcHJvdmlkZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlEZXNjcmlwdG9yKEZpbGUgZGVzY3JpcHRvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkWG1sRW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChkZXNjcmlwdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRvYy5nZXRYbWxFbmNvZGluZygpLCBleHBlY3RlZFhtbEVuY29kaW5nKTsKLQotICAgICAgICBFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gZ2V0U2VydmljZXNFbGVtZW50KGRvYyk7Ci0KLSAgICAgICAgTGlzdCBjb25zdW1lcyA9IGdldENvbnN1bWVzKHNlcnZpY2VFbGVtZW50KTsKLSAgICAgICAgQ29uc3VtZXMgY29uID0gKENvbnN1bWVzKSBjb25zdW1lcy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb24uZ2V0U2VydmljZU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgImFiY+Xk9iIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY29uLmdldEVuZHBvaW50TmFtZSgpLCAiY29uc3VtZXLl5PYiKTsKLQotICAgICAgICBMaXN0IHByb3ZpZGVzID0gZ2V0UHJvdmlkZXMoc2VydmljZUVsZW1lbnQpOwotICAgICAgICBQcm92aWRlcyBwcm92ID0gKFByb3ZpZGVzKSBwcm92aWRlcy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcm92LmdldFNlcnZpY2VOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksICJhYmPl5PYiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByb3YuZ2V0RW5kcG9pbnROYW1lKCksICJwcm92aWRlcuXk9iIpOwotICAgIH0KLQotICAgIHByaXZhdGUgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoRmlsZSBqYmlTZXJ2aWNlc0ZpbGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKGpiaVNlcnZpY2VzRmlsZSk7Ci0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0U2VydmljZXNFbGVtZW50KERvY3VtZW50IGRvYykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE5vZGUgamJpTm9kZSA9IGRvYy5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGFzc2VydFRydWUoWG1sRGVzY3JpcHRvckhlbHBlci5pc0VsZW1lbnQoamJpTm9kZSwgSkJJX05BTUVTUEFDRSwgImpiaSIpKTsKLSAgICAgICAgTm9kZSB0bXBOb2RlID0gamJpTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHRtcE5vZGUpOwotICAgICAgICAgICAgaWYgKFhtbERlc2NyaXB0b3JIZWxwZXIuaXNFbGVtZW50KHRtcE5vZGUsIEpCSV9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlcyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFbGVtZW50KSB0bXBOb2RlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0bXBOb2RlID0gdG1wTm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGdldENvbnN1bWVzKEVsZW1lbnQgc2VydmljZXNFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBjb25zdW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBzZXJ2aWNlc0VsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFhtbERlc2NyaXB0b3JIZWxwZXIuaXNFbGVtZW50KGNoaWxkRWxlbWVudCwgSkJJX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdW1lcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnN1bWVzIG5ld0NvbnN1bWVzID0gbmV3IENvbnN1bWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0NvbnN1bWVzLnNldEVuZHBvaW50TmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuZHBvaW50TmFtZShjaGlsZEVsZW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q29uc3VtZXMuc2V0SW50ZXJmYWNlTmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVyZmFjZU5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0NvbnN1bWVzLnNldFNlcnZpY2VOYW1lKFhtbERlc2NyaXB0b3JIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZU5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN1bWVzLmFkZChuZXdDb25zdW1lcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnN1bWVzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBnZXRQcm92aWRlcyhFbGVtZW50IHNlcnZpY2VzRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgcHJvdmlkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gc2VydmljZXNFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IChFbGVtZW50KSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgICAgICAgIGlmIChYbWxEZXNjcmlwdG9ySGVscGVyLmlzRWxlbWVudChjaGlsZEVsZW1lbnQsIEpCSV9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAicHJvdmlkZXMiKSkgewotICAgICAgICAgICAgICAgICAgICBQcm92aWRlcyBuZXdQcm92aWRlcyA9IG5ldyBQcm92aWRlcygpOwotICAgICAgICAgICAgICAgICAgICBuZXdQcm92aWRlcy5zZXRFbmRwb2ludE5hbWUoWG1sRGVzY3JpcHRvckhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludE5hbWUoY2hpbGRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1Byb3ZpZGVzLnNldEludGVyZmFjZU5hbWUoWG1sRGVzY3JpcHRvckhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnRlcmZhY2VOYW1lKGNoaWxkRWxlbWVudCkpOwotICAgICAgICAgICAgICAgICAgICBuZXdQcm92aWRlcy5zZXRTZXJ2aWNlTmFtZShYbWxEZXNjcmlwdG9ySGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlcnZpY2VOYW1lKGNoaWxkRWxlbWVudCkpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlcy5hZGQobmV3UHJvdmlkZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm92aWRlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9qYmktc2VydmljZXMueG1sIGIvamJpLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvamJpLXNlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2N2IxOS4uMDAwMDAwMAotLS0gYS9qYmktbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9qYmktc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyIgPz4KLTxzZXJ2aWNlcyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICAgICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamJpIgotICAgICAgICAgIHhtbG5zOndmPSJodHRwOi8vd3d3Lm5vdmVsbC5jb20vcHJvdmlzaW9uaW5nL3NlcnZpY2UiPgotPCEtLQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gVGVzdCBDb3B5cmlnaHQgKGMpIDIwMTAgYmxhaCBibGFoIGJsYWgKLQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0+Ci0gIDxwcm92aWRlcyBzZXJ2aWNlLW5hbWU9IndmOlByb3Zpc2lvbmluZ1NlcnZpY2UiCi0gICAgICAgICAgICBpbnRlcmZhY2UtbmFtZT0id2Y6UHJvdmlzaW9uaW5nIgotICAgICAgICAgICAgZW5kcG9pbnQtbmFtZT0iU2VydmljZUVuZ2luZV9KQklQb3J0IiAvPgotPC9zZXJ2aWNlcz4KLSAKZGlmZiAtLWdpdCBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLXRlc3RzLnByb3BlcnRpZXMgYi9qYmktbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai10ZXN0cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWE0ODg3Li4wMDAwMDAwCi0tLSBhL2piaS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLXRlc3RzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jIA0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jIA0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jIA0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSMgZGlzdHJpYnV0ZWQgIHVuZGVyIHRoZSAgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSMgV0lUSE9VVCAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TICBPRiBBTlkgS0lORCwgZWl0aGVyICBleHByZXNzICBvcg0KLSMgaW1wbGllZC4NCi0jICANCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0jDQotDQotIw0KLSMgVGhlIGxvZ2dpbmcgcHJvcGVydGllcyB1c2VkIGR1cmluZyB0ZXN0cy4uDQotIw0KLWxvZzRqLnJvb3RMb2dnZXI9REVCVUcsIG91dA0KLQ0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmFjdGl2ZW1xPUlORk8NCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5hY3RpdmVtcS5zcHJpbmc9V0FSTg0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmFjdGl2ZW1xLnN0b3JlLmpvdXJuYWw9SU5GTw0KLWxvZzRqLmxvZ2dlci5vcmcuYWN0aXZlaW8uam91cm5hbD1JTkZPDQotDQotIyBDT05TT0xFIGFwcGVuZGVyIG5vdCB1c2VkIGJ5IGRlZmF1bHQNCi1sb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyUtMTUuMTV0XSAlLTVwICUtMzAuMzBjezF9IC0gJW0lbg0KLQ0KLSMgRmlsZSBhcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLm91dD1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLm91dC5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIub3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJS0xNS4xNXRdICUtNXAgJS0zMC4zMGN7MX0gLSAlbSVuDQotbG9nNGouYXBwZW5kZXIub3V0LmZpbGU9dGFyZ2V0L3NlcnZpY2VtaXgtdGVzdC5sb2cNCi1sb2c0ai5hcHBlbmRlci5vdXQuYXBwZW5kPXRydWUNCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW5zLXBvbS90YXJnZXQvLnBseGFyYyBiL21hdmVuLXBsdWdpbnMtcG9tL3RhcmdldC8ucGx4YXJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZWE2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW5zLXBvbS90YXJnZXQvLnBseGFyYwpAQCAtMCwwICsxIEBACittYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW5zLXBvbS90YXJnZXQvbGVnYWwueG1sIGIvbWF2ZW4tcGx1Z2lucy1wb20vdGFyZ2V0L2xlZ2FsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzIzZjExCi0tLSAvZGV2L251bGwKKysrIGIvbWF2ZW4tcGx1Z2lucy1wb20vdGFyZ2V0L2xlZ2FsLnhtbApAQCAtMCwwICsxLDEzNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c3VwcGxlbWVudGFsRGF0YU1vZGVscz4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U3VuIEpBWEIgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIFJ1bnRpbWU8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlN1biBKQVhCIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBUb29sczwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlN1biBNaWNyb3N5c3RlbXM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPkNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sPC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwubWVzc2FnaW5nLnNhYWo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zYWFqLWltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5TdW4gU0FBSiBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb248L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmphdmF4LnhtbC5zb2FwPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2Fhai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5TdW4gU0FBSiBBUEk8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+TmVldGhpPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmphdmF4LnhtbC53czwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpheHdzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkphdmEgQVBJIGZvciBYTUwtQmFzZWQgV2ViIFNlcnZpY2VzIChKQVgtV1MgQVBJKTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlN1biBNaWNyb3N5c3RlbXM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPkNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sPC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQiBBUEkpPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtczwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+Q09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWw8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQiBBUEkpPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtczwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+Q09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWw8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhhbGFuPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIFhhbGFuLUphdmE8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+bmV0LmphdmEuZGV2LnN0YXgtdXRpbHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zdGF4LXV0aWxzPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U3RBWCBVdGlsaXRpZXM8L25hbWU+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+d3NzNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD53c3M0ajwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBXU1M0SjwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5qZG9tPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amRvbTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkpET008L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5qZG9tLm9yZzwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3Lmpkb20ub3JnPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+TW9kaWZpZWQgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2U8L25hbWU+CisgICAgICAgICAgPHVybD5saWNlbnNlcy9qZG9tLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPnhtbC1zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhtbHNlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlhNTCBTZWN1cml0eTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+WE1MIEFQSXM8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Ym91bmN5Y2FzdGxlPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YmNwcm92LWpkazE0PC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+Qm91bmN5IENhc3RsZSBDcnlwdG8gQVBJcyBmb3IgSmF2YTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBMZWdpb24gb2YgdGhlIEJvdW5jeSBDYXN0bGU8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+Qm91bmN5IENhc3RsZSBMaWNlbnNlPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnL2xpY2VuY2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmFudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBBbnQ8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+YW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YW50LW5vZGVwczwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBBbnQgKG5vZGVwcyk8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmpldHRpc29uPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dGlzb248L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5KZXR0aXNvbjwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPkVudm9pIFNvbHV0aW9ucyBMTEM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5lbnZvaXNvbHV0aW9ucy5jb208L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL2pldHRpc29uLmNvZGVoYXVzLm9yZy9MaWNlbnNlPC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5taW5hPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWluYS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIE1JTkEgQ29yZSBBUEk8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5taW5hPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWluYS1maWx0ZXItc3NsPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIE1JTkEgU1NMIEZpbHRlcjwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBDb21tb25zIENvZGVjPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIENvbW1vbnMgQ29sbGVjdGlvbnM8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kYmNwPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1kYmNwPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIENvbW1vbnMgREJDUDwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWpleGw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWpleGw8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgQ29tbW9ucyBKRVhMPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBDb21tb25zIExvZ2dpbmc8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly9jb21tb25zLmFwYWNoZS5vcmcvbG9nZ2luZzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgQ29tbW9ucyBMb2dnaW5nIEFwaTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL2NvbW1vbnMuYXBhY2hlLm9yZy9sb2dnaW5nPC91cmw+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1wb29sPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1wb29sPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIENvbW1vbnMgUG9vbDwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL2NvbW1vbnMuYXBhY2hlLm9yZy9wb29sPC91cmw+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy12ZnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLXZmczwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBDb21tb25zIFZGUzwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFjdGl2ZW1xPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YWN0aXZlbXEtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFjdGl2ZU1RIDo6IENvcmU8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYW1lbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhbWVsLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5DYW1lbCA6OiBDb3JlPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueGJlYW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54YmVhbi1jbGFzc2xvYWRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlhCZWFuIDo6IENsYXNzbG9hZGVyPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueGJlYW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54YmVhbi1maW5kZXI8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5YQmVhbiA6OiBDbGFzc3BhdGggUmVzb3VyY2UgRmluZGVyPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueGJlYW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54YmVhbi1uYW1pbmc8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5YQmVhbiA6OiBOYW1pbmc8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS54YmVhbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhiZWFuLXJlZmxlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5YQmVhbiA6OiBSZWZsZWN0PC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueGJlYW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54YmVhbi1zcHJpbmc8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5YQmVhbiA6OiBTcHJpbmc8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U0xGNEogQVBJIE1vZHVsZTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlFPUy5jaDwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnFvcy5jaDwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPk1JVCBzdHlsZTwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWpkazE0PC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U0xGNEogSkRLMTQgQmluZGluZzwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlFPUy5jaDwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnFvcy5jaDwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPk1JVCBzdHlsZTwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5Mb2c0ajwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLmNvbXBvbmVudHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gVHhNYW5hZ2VyIDo6IENvbm5lY3RvcjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5jb21wb25lbnRzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tdHJhbnNhY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gVHhNYW5hZ2VyIDo6IFRyYW5zYWN0aW9uPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLm9zZ2k8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctb3NnaS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U3ByaW5nIE9TR2kgQ29yZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL29zZ2kvPC91cmw+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5TcHJpbmcgRnJhbWV3b3JrPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcmsub3NnaTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1vc2dpLWV4dGVuZGVyPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U3ByaW5nIE9TR2kgRXh0ZW5kZXI8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9vc2dpLzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+U3ByaW5nIEZyYW1ld29yazwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLm9zZ2k8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctb3NnaS1pbzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlNwcmluZyBPU0dpIElPPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvb3NnaS88L3VybD4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlNwcmluZyBGcmFtZXdvcms8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9iamVjdHdlYi5ob3dsPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aG93bDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkhvd2wgTG9nZ2VyPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vaG93bC5vYmplY3R3ZWIub3JnLzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+T2JqZWN0V2ViPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cub2JqZWN0d2ViLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQlNEIExpY2Vuc2U8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vaG93bC5vYmplY3R3ZWIub3JnL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY2xhc3N3b3JsZHM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5QbGV4dXMgQ2xhc3N3b3JsZHM8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly9wbGV4dXMuY29kZWhhdXMub3JnL3BsZXh1cy1jbGFzc3dvcmxkcy88L3VybD4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPkNvZGVoYXVzPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuY29kZWhhdXMub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy54c3RyZWFtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eHN0cmVhbTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlhTdHJlYW0gQ29yZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3hzdHJlYW0uY29kZWhhdXMub3JnLzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+Q29kZWhhdXM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5jb2RlaGF1cy5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEJTRCBMaWNlbnNlPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3hzdHJlYW0uY29kZWhhdXMuY29tL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdlcm9uaW1vIFNwZWNzIDo6IEFjdGl2YXRpb24gMS4xPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tajJlZS1jb25uZWN0b3JfMS41X3NwZWM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gU3BlY3MgOjogSjJFRSBDb25uZWN0b3IgMS41PC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tajJlZS1tYW5hZ2VtZW50XzEuMV9zcGVjPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdlcm9uaW1vIFNwZWNzIDo6IEoyRUUgTWFuYWdlbWVudCAxLjE8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHZXJvbmltbyBTcGVjcyA6OiBKYXZhTWFpbCAxLjQ8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qbXNfMS4xX3NwZWM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gU3BlY3MgOjogSk1TIDEuMTwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWp0YV8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHZXJvbmltbyBTcGVjcyA6OiBKVEEgMS4xPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tc2Fhal8xLjNfc3BlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHZXJvbmltbyBTcGVjcyA6OiBTQUFKIDEuMzwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXNlcnZsZXRfMi41X3NwZWM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gU3BlY3MgOjogU2VydmxldCAyLjU8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXN0YXgtYXBpXzEuMF9zcGVjPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdlcm9uaW1vIFNwZWNzIDo6IFN0YXggQVBJIDEuMDwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtY29tbWFuZC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR1NoZWxsIENvbW1hbmQgQVBJPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLmdzaGVsbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBDb3JlPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLmdzaGVsbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1wYXJzZXI8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR1NoZWxsIFBhcnNlcjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtd2hpc3BlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHU2hlbGwgV2hpc3BlcjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGwucmVtb3RlPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3NoZWxsLXJlbW90ZS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR1NoZWxsIFJlbW90ZSA6OiBDbGllbnQ8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uZ3NoZWxsLnJlbW90ZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1yZW1vdGUtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBSZW1vdGUgOjogQ29tbW9uPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLmdzaGVsbC5yZW1vdGU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtcmVtb3RlLXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHU2hlbGwgUmVtb3RlIDo6IFNlcnZlcjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGwuc3VwcG9ydDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1hbnNpPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBTdXBwb3J0IDo6IEFOU0k8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uZ3NoZWxsLnN1cHBvcnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtY2xwPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBTdXBwb3J0IDo6IENvbW1hbmQtTGluZSBQcm9jZXNzb3IgKENMUCk8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uZ3NoZWxsLnN1cHBvcnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBTdXBwb3J0IDo6IENvbW1vbjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGwuc3VwcG9ydDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1pMThuPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBTdXBwb3J0IDo6IGkxOG48L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uZ3NoZWxsLnN1cHBvcnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtcHJlZnM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR1NoZWxsIFN1cHBvcnQgOjogUHJlZmVyZW5jZXM8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmpsaW5lPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amxpbmU8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5KTGluZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL2psaW5lLnNvdXJjZWZvcmdlLm5ldDwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+SkxpbmU8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL2psaW5lLnNvdXJjZWZvcmdlLm5ldDwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBCU0QgTGljZW5zZTwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly9qbGluZS5zb3VyY2Vmb3JnZS5uZXQvbGljZW5zZS5odG1sPC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkpldHR5IFNlcnZlcjwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL2pldHR5Lm1vcnRiYXkub3JnLzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+TW9ydCBCYXkgQ29uc3VsdGluZzwvbmFtZT4KKwkgICAgPHVybD5odHRwOi8vd3d3Lm1vcnRiYXkuY29tPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5KZXR0eSBVdGlsaXRpZXM8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly9qZXR0eS5tb3J0YmF5Lm9yZy88L3VybD4KKyAgICAgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk1vcnQgQmF5IENvbnN1bHRpbmc8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5tb3J0YmF5LmNvbTwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLmJhc2U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcHM0ai1iYXNlLWxhbmc8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBCYXNlIC0gTGFuZzwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvYmFzZS9vcHM0ai1iYXNlLWxhbmc8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLmJhc2U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcHM0ai1iYXNlLXV0aWwtY29sbGVjdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBCYXNlIC0gVXRpbCAtIENvbGxlY3Rpb25zPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9iYXNlL29wczRqLWJhc2UtdXRpbC1jb2xsZWN0aW9uczwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGouYmFzZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9wczRqLWJhc2UtdXRpbC14bWw8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBCYXNlIC0gVXRpbCAtIFhNTDwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvYmFzZS9vcHM0ai1iYXNlLXV0aWwteG1sPC91cmw+CisJICA8b3JnYW5pemF0aW9uPgorCSAgICA8bmFtZT5PUFM0SiAtIE9wZW4gUGFydGljaXBhdGlvbiBTb2Z0d2FyZSBmb3IgSmF2YTwvbmFtZT4KKwkgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy88L3VybD4KKwkgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXgubG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBheC1sb2dnaW5nLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIC0gUGF4IExvZ2dpbmcgQVBJPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9wYXgvbG9nZ2luZy9wYXgtbG9nZ2luZy1hcGk8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5sb2dnaW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LWxvZ2dpbmctc2VydmljZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIC0gUGF4IExvZ2dpbmcgU2VydmljZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvcGF4L2xvZ2dpbmcvcGF4LWxvZ2dpbmctc2VydmljZTwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LnN3aXNzYm94PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LXN3aXNzYm94LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggU3dpc3Nib3ggLSBPU0dpIENvcmU8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC9zd2lzc2JveC9wYXgtc3dpc3Nib3gtY29yZTwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LnN3aXNzYm94PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LXN3aXNzYm94LWV4dGVuZGVyPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+T1BTNEogUGF4IFN3aXNzYm94IC0gRXh0ZW5kZXI8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC9zd2lzc2JveC9wYXgtc3dpc3Nib3gtZXh0ZW5kZXI8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5zd2lzc2JveDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBheC1zd2lzc2JveC1saWZlY3ljbGU8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggU3dpc3Nib3ggLSBMaWZlY3ljbGU8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC9zd2lzc2JveC9wYXgtc3dpc3Nib3gtbGlmZWN5Y2xlPC91cmw+CisJICA8b3JnYW5pemF0aW9uPgorCSAgICA8bmFtZT5PUFM0SiAtIE9wZW4gUGFydGljaXBhdGlvbiBTb2Z0d2FyZSBmb3IgSmF2YTwvbmFtZT4KKwkgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy88L3VybD4KKwkgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguc3dpc3Nib3g8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtc3dpc3Nib3gtb3B0aW9uYWwtamNsPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+T1BTNEogUGF4IFN3aXNzYm94IC0gT3B0aW9uYWwgSkNMPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9wYXgvc3dpc3Nib3gvcGF4LXN3aXNzYm94LW9wdGlvbmFsLWpjbDwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LnN3aXNzYm94PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LXN3aXNzYm94LXRyYWNrZXI8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggU3dpc3Nib3ggLSBUcmFja2VyPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9wYXgvc3dpc3Nib3gvcGF4LXN3aXNzYm94LXRyYWNrZXI8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC51cmw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtdXJsLW12bjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIFBheCBVcmwgLSBtdm46PC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9wYXgvdXJsL3BheC11cmwtbXZuPC91cmw+CisJICA8b3JnYW5pemF0aW9uPgorCSAgICA8bmFtZT5PUFM0SiAtIE9wZW4gUGFydGljaXBhdGlvbiBTb2Z0d2FyZSBmb3IgSmF2YTwvbmFtZT4KKwkgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy88L3VybD4KKwkgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXgudXJsPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LXVybC13YXI8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggVXJsIC0gd2FyOjwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvcGF4L3VybC9wYXgtdXJsLXdhcjwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LndlYjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBheC13ZWItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+T1BTNEogUGF4IFdlYiAtIFdlYiBDb250YWluZXI8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC93ZWIvcGF4LXdlYi1idW5kbGU8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtd2ViLWpzcDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIFBheCBXZWIgLSBKU1A8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC93ZWIvcGF4LXdlYi1qc3A8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWItZXh0ZW5kZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtd2ViLWV4LXdhcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIFBheCBXZWIgRXh0ZW5kZXIgLSBXQVI8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC93ZWItZXh0ZW5kZXIvcGF4LXdlYi1leC13YXI8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWItZXh0ZW5kZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtd2ViLWV4LXdoaXRlYm9hcmQ8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggV2ViIEV4dGVuZGVyIC0gV2hpdGVib2FyZDwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvcGF4L3dlYi1leHRlbmRlci9wYXgtd2ViLWV4LXdoaXRlYm9hcmQ8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+Cis8L3N1cHBsZW1lbnRhbERhdGFNb2RlbHM+CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW5zLXBvbS90YXJnZXQvbGVnYWwvbGVnYWwueG1sIGIvbWF2ZW4tcGx1Z2lucy1wb20vdGFyZ2V0L2xlZ2FsL2xlZ2FsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzIzZjExCi0tLSAvZGV2L251bGwKKysrIGIvbWF2ZW4tcGx1Z2lucy1wb20vdGFyZ2V0L2xlZ2FsL2xlZ2FsLnhtbApAQCAtMCwwICsxLDEzNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c3VwcGxlbWVudGFsRGF0YU1vZGVscz4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U3VuIEpBWEIgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIFJ1bnRpbWU8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlN1biBKQVhCIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBUb29sczwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlN1biBNaWNyb3N5c3RlbXM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPkNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sPC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwubWVzc2FnaW5nLnNhYWo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zYWFqLWltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5TdW4gU0FBSiBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb248L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmphdmF4LnhtbC5zb2FwPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2Fhai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5TdW4gU0FBSiBBUEk8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+TmVldGhpPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmphdmF4LnhtbC53czwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpheHdzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkphdmEgQVBJIGZvciBYTUwtQmFzZWQgV2ViIFNlcnZpY2VzIChKQVgtV1MgQVBJKTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlN1biBNaWNyb3N5c3RlbXM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPkNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sPC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQiBBUEkpPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtczwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+Q09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWw8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQiBBUEkpPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtczwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+Q09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWw8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhhbGFuPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIFhhbGFuLUphdmE8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+bmV0LmphdmEuZGV2LnN0YXgtdXRpbHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zdGF4LXV0aWxzPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U3RBWCBVdGlsaXRpZXM8L25hbWU+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+d3NzNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD53c3M0ajwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBXU1M0SjwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5qZG9tPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amRvbTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkpET008L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5qZG9tLm9yZzwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3Lmpkb20ub3JnPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+TW9kaWZpZWQgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2U8L25hbWU+CisgICAgICAgICAgPHVybD5saWNlbnNlcy9qZG9tLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPnhtbC1zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhtbHNlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlhNTCBTZWN1cml0eTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+WE1MIEFQSXM8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Ym91bmN5Y2FzdGxlPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YmNwcm92LWpkazE0PC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+Qm91bmN5IENhc3RsZSBDcnlwdG8gQVBJcyBmb3IgSmF2YTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBMZWdpb24gb2YgdGhlIEJvdW5jeSBDYXN0bGU8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+Qm91bmN5IENhc3RsZSBMaWNlbnNlPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnL2xpY2VuY2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmFudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBBbnQ8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+YW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YW50LW5vZGVwczwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBBbnQgKG5vZGVwcyk8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmpldHRpc29uPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dGlzb248L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5KZXR0aXNvbjwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPkVudm9pIFNvbHV0aW9ucyBMTEM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5lbnZvaXNvbHV0aW9ucy5jb208L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL2pldHRpc29uLmNvZGVoYXVzLm9yZy9MaWNlbnNlPC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5taW5hPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWluYS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIE1JTkEgQ29yZSBBUEk8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5taW5hPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWluYS1maWx0ZXItc3NsPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIE1JTkEgU1NMIEZpbHRlcjwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBDb21tb25zIENvZGVjPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIENvbW1vbnMgQ29sbGVjdGlvbnM8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kYmNwPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1kYmNwPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIENvbW1vbnMgREJDUDwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWpleGw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWpleGw8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgQ29tbW9ucyBKRVhMPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBDb21tb25zIExvZ2dpbmc8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly9jb21tb25zLmFwYWNoZS5vcmcvbG9nZ2luZzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgQ29tbW9ucyBMb2dnaW5nIEFwaTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL2NvbW1vbnMuYXBhY2hlLm9yZy9sb2dnaW5nPC91cmw+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1wb29sPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1wb29sPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIENvbW1vbnMgUG9vbDwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL2NvbW1vbnMuYXBhY2hlLm9yZy9wb29sPC91cmw+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy12ZnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLXZmczwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBDb21tb25zIFZGUzwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFjdGl2ZW1xPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YWN0aXZlbXEtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFjdGl2ZU1RIDo6IENvcmU8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYW1lbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhbWVsLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5DYW1lbCA6OiBDb3JlPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueGJlYW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54YmVhbi1jbGFzc2xvYWRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlhCZWFuIDo6IENsYXNzbG9hZGVyPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueGJlYW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54YmVhbi1maW5kZXI8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5YQmVhbiA6OiBDbGFzc3BhdGggUmVzb3VyY2UgRmluZGVyPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueGJlYW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54YmVhbi1uYW1pbmc8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5YQmVhbiA6OiBOYW1pbmc8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS54YmVhbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhiZWFuLXJlZmxlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5YQmVhbiA6OiBSZWZsZWN0PC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueGJlYW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54YmVhbi1zcHJpbmc8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5YQmVhbiA6OiBTcHJpbmc8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U0xGNEogQVBJIE1vZHVsZTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlFPUy5jaDwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnFvcy5jaDwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPk1JVCBzdHlsZTwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWpkazE0PC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U0xGNEogSkRLMTQgQmluZGluZzwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlFPUy5jaDwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnFvcy5jaDwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPk1JVCBzdHlsZTwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5Mb2c0ajwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLmNvbXBvbmVudHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gVHhNYW5hZ2VyIDo6IENvbm5lY3RvcjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5jb21wb25lbnRzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tdHJhbnNhY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gVHhNYW5hZ2VyIDo6IFRyYW5zYWN0aW9uPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLm9zZ2k8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctb3NnaS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U3ByaW5nIE9TR2kgQ29yZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL29zZ2kvPC91cmw+CisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5TcHJpbmcgRnJhbWV3b3JrPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcmsub3NnaTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1vc2dpLWV4dGVuZGVyPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+U3ByaW5nIE9TR2kgRXh0ZW5kZXI8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9vc2dpLzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+U3ByaW5nIEZyYW1ld29yazwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLm9zZ2k8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctb3NnaS1pbzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlNwcmluZyBPU0dpIElPPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvb3NnaS88L3VybD4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlNwcmluZyBGcmFtZXdvcms8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9iamVjdHdlYi5ob3dsPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aG93bDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkhvd2wgTG9nZ2VyPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vaG93bC5vYmplY3R3ZWIub3JnLzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+T2JqZWN0V2ViPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cub2JqZWN0d2ViLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQlNEIExpY2Vuc2U8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vaG93bC5vYmplY3R3ZWIub3JnL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY2xhc3N3b3JsZHM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5QbGV4dXMgQ2xhc3N3b3JsZHM8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly9wbGV4dXMuY29kZWhhdXMub3JnL3BsZXh1cy1jbGFzc3dvcmxkcy88L3VybD4KKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPkNvZGVoYXVzPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuY29kZWhhdXMub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy54c3RyZWFtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eHN0cmVhbTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPlhTdHJlYW0gQ29yZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3hzdHJlYW0uY29kZWhhdXMub3JnLzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+Q29kZWhhdXM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5jb2RlaGF1cy5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEJTRCBMaWNlbnNlPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3hzdHJlYW0uY29kZWhhdXMuY29tL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdlcm9uaW1vIFNwZWNzIDo6IEFjdGl2YXRpb24gMS4xPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tajJlZS1jb25uZWN0b3JfMS41X3NwZWM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gU3BlY3MgOjogSjJFRSBDb25uZWN0b3IgMS41PC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tajJlZS1tYW5hZ2VtZW50XzEuMV9zcGVjPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdlcm9uaW1vIFNwZWNzIDo6IEoyRUUgTWFuYWdlbWVudCAxLjE8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHZXJvbmltbyBTcGVjcyA6OiBKYXZhTWFpbCAxLjQ8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qbXNfMS4xX3NwZWM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gU3BlY3MgOjogSk1TIDEuMTwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWp0YV8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHZXJvbmltbyBTcGVjcyA6OiBKVEEgMS4xPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tc2Fhal8xLjNfc3BlYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHZXJvbmltbyBTcGVjcyA6OiBTQUFKIDEuMzwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXNlcnZsZXRfMi41X3NwZWM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR2Vyb25pbW8gU3BlY3MgOjogU2VydmxldCAyLjU8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXN0YXgtYXBpXzEuMF9zcGVjPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdlcm9uaW1vIFNwZWNzIDo6IFN0YXggQVBJIDEuMDwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtY29tbWFuZC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR1NoZWxsIENvbW1hbmQgQVBJPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLmdzaGVsbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBDb3JlPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLmdzaGVsbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1wYXJzZXI8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR1NoZWxsIFBhcnNlcjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtd2hpc3BlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHU2hlbGwgV2hpc3BlcjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGwucmVtb3RlPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3NoZWxsLXJlbW90ZS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR1NoZWxsIFJlbW90ZSA6OiBDbGllbnQ8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uZ3NoZWxsLnJlbW90ZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1yZW1vdGUtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBSZW1vdGUgOjogQ29tbW9uPC9uYW1lPiAKKyAgICAgIDxvcmdhbml6YXRpb24+CisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLmdzaGVsbC5yZW1vdGU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtcmVtb3RlLXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBHU2hlbGwgUmVtb3RlIDo6IFNlcnZlcjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGwuc3VwcG9ydDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1hbnNpPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBTdXBwb3J0IDo6IEFOU0k8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uZ3NoZWxsLnN1cHBvcnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtY2xwPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBTdXBwb3J0IDo6IENvbW1hbmQtTGluZSBQcm9jZXNzb3IgKENMUCk8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uZ3NoZWxsLnN1cHBvcnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBTdXBwb3J0IDo6IENvbW1vbjwvbmFtZT4gCisgICAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5nc2hlbGwuc3VwcG9ydDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzaGVsbC1pMThuPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+QXBhY2hlIEdTaGVsbCBTdXBwb3J0IDo6IGkxOG48L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uZ3NoZWxsLnN1cHBvcnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc2hlbGwtcHJlZnM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5BcGFjaGUgR1NoZWxsIFN1cHBvcnQgOjogUHJlZmVyZW5jZXM8L25hbWU+IAorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgIDwvb3JnYW5pemF0aW9uPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPmpsaW5lPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amxpbmU8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5KTGluZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL2psaW5lLnNvdXJjZWZvcmdlLm5ldDwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+SkxpbmU8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL2psaW5lLnNvdXJjZWZvcmdlLm5ldDwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBCU0QgTGljZW5zZTwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly9qbGluZS5zb3VyY2Vmb3JnZS5uZXQvbGljZW5zZS5odG1sPC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPkpldHR5IFNlcnZlcjwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL2pldHR5Lm1vcnRiYXkub3JnLzwvdXJsPgorICAgICAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+TW9ydCBCYXkgQ29uc3VsdGluZzwvbmFtZT4KKwkgICAgPHVybD5odHRwOi8vd3d3Lm1vcnRiYXkuY29tPC91cmw+CisgICAgICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5KZXR0eSBVdGlsaXRpZXM8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly9qZXR0eS5tb3J0YmF5Lm9yZy88L3VybD4KKyAgICAgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk1vcnQgQmF5IENvbnN1bHRpbmc8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5tb3J0YmF5LmNvbTwvdXJsPgorICAgICAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLmJhc2U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcHM0ai1iYXNlLWxhbmc8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBCYXNlIC0gTGFuZzwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvYmFzZS9vcHM0ai1iYXNlLWxhbmc8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLmJhc2U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcHM0ai1iYXNlLXV0aWwtY29sbGVjdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBCYXNlIC0gVXRpbCAtIENvbGxlY3Rpb25zPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9iYXNlL29wczRqLWJhc2UtdXRpbC1jb2xsZWN0aW9uczwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGouYmFzZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9wczRqLWJhc2UtdXRpbC14bWw8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBCYXNlIC0gVXRpbCAtIFhNTDwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvYmFzZS9vcHM0ai1iYXNlLXV0aWwteG1sPC91cmw+CisJICA8b3JnYW5pemF0aW9uPgorCSAgICA8bmFtZT5PUFM0SiAtIE9wZW4gUGFydGljaXBhdGlvbiBTb2Z0d2FyZSBmb3IgSmF2YTwvbmFtZT4KKwkgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy88L3VybD4KKwkgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXgubG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBheC1sb2dnaW5nLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIC0gUGF4IExvZ2dpbmcgQVBJPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9wYXgvbG9nZ2luZy9wYXgtbG9nZ2luZy1hcGk8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5sb2dnaW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LWxvZ2dpbmctc2VydmljZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIC0gUGF4IExvZ2dpbmcgU2VydmljZTwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvcGF4L2xvZ2dpbmcvcGF4LWxvZ2dpbmctc2VydmljZTwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LnN3aXNzYm94PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LXN3aXNzYm94LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggU3dpc3Nib3ggLSBPU0dpIENvcmU8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC9zd2lzc2JveC9wYXgtc3dpc3Nib3gtY29yZTwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LnN3aXNzYm94PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LXN3aXNzYm94LWV4dGVuZGVyPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+T1BTNEogUGF4IFN3aXNzYm94IC0gRXh0ZW5kZXI8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC9zd2lzc2JveC9wYXgtc3dpc3Nib3gtZXh0ZW5kZXI8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5zd2lzc2JveDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBheC1zd2lzc2JveC1saWZlY3ljbGU8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggU3dpc3Nib3ggLSBMaWZlY3ljbGU8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC9zd2lzc2JveC9wYXgtc3dpc3Nib3gtbGlmZWN5Y2xlPC91cmw+CisJICA8b3JnYW5pemF0aW9uPgorCSAgICA8bmFtZT5PUFM0SiAtIE9wZW4gUGFydGljaXBhdGlvbiBTb2Z0d2FyZSBmb3IgSmF2YTwvbmFtZT4KKwkgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy88L3VybD4KKwkgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguc3dpc3Nib3g8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtc3dpc3Nib3gtb3B0aW9uYWwtamNsPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+T1BTNEogUGF4IFN3aXNzYm94IC0gT3B0aW9uYWwgSkNMPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9wYXgvc3dpc3Nib3gvcGF4LXN3aXNzYm94LW9wdGlvbmFsLWpjbDwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LnN3aXNzYm94PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LXN3aXNzYm94LXRyYWNrZXI8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggU3dpc3Nib3ggLSBUcmFja2VyPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9wYXgvc3dpc3Nib3gvcGF4LXN3aXNzYm94LXRyYWNrZXI8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC51cmw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtdXJsLW12bjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIFBheCBVcmwgLSBtdm46PC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy9wcm9qZWN0cy9wYXgvdXJsL3BheC11cmwtbXZuPC91cmw+CisJICA8b3JnYW5pemF0aW9uPgorCSAgICA8bmFtZT5PUFM0SiAtIE9wZW4gUGFydGljaXBhdGlvbiBTb2Z0d2FyZSBmb3IgSmF2YTwvbmFtZT4KKwkgICAgPHVybD5odHRwOi8vd3d3Lm9wczRqLm9yZy88L3VybD4KKwkgIDwvb3JnYW5pemF0aW9uPgorICAgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICA8L2xpY2Vuc2VzPgorICAgIDwvcHJvamVjdD4KKyAgPC9zdXBwbGVtZW50PgorICA8c3VwcGxlbWVudD4KKyAgICA8cHJvamVjdD4KKyAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXgudXJsPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGF4LXVybC13YXI8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggVXJsIC0gd2FyOjwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvcGF4L3VybC9wYXgtdXJsLXdhcjwvdXJsPgorCSAgPG9yZ2FuaXphdGlvbj4KKwkgICAgPG5hbWU+T1BTNEogLSBPcGVuIFBhcnRpY2lwYXRpb24gU29mdHdhcmUgZm9yIEphdmE8L25hbWU+CisJICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvPC91cmw+CisJICA8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgPC9saWNlbnNlcz4KKyAgICA8L3Byb2plY3Q+CisgIDwvc3VwcGxlbWVudD4KKyAgPHN1cHBsZW1lbnQ+CisgICAgPHByb2plY3Q+CisgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LndlYjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBheC13ZWItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgPG5hbWU+T1BTNEogUGF4IFdlYiAtIFdlYiBDb250YWluZXI8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC93ZWIvcGF4LXdlYi1idW5kbGU8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtd2ViLWpzcDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIFBheCBXZWIgLSBKU1A8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC93ZWIvcGF4LXdlYi1qc3A8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWItZXh0ZW5kZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtd2ViLWV4LXdhcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxuYW1lPk9QUzRKIFBheCBXZWIgRXh0ZW5kZXIgLSBXQVI8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnL3Byb2plY3RzL3BheC93ZWItZXh0ZW5kZXIvcGF4LXdlYi1leC13YXI8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+CisgIDxzdXBwbGVtZW50PgorICAgIDxwcm9qZWN0PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWItZXh0ZW5kZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wYXgtd2ViLWV4LXdoaXRlYm9hcmQ8L2FydGlmYWN0SWQ+CisgICAgICA8bmFtZT5PUFM0SiBQYXggV2ViIEV4dGVuZGVyIC0gV2hpdGVib2FyZDwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5vcHM0ai5vcmcvcHJvamVjdHMvcGF4L3dlYi1leHRlbmRlci9wYXgtd2ViLWV4LXdoaXRlYm9hcmQ8L3VybD4KKwkgIDxvcmdhbml6YXRpb24+CisJICAgIDxuYW1lPk9QUzRKIC0gT3BlbiBQYXJ0aWNpcGF0aW9uIFNvZnR3YXJlIGZvciBKYXZhPC9uYW1lPgorCSAgICA8dXJsPmh0dHA6Ly93d3cub3BzNGoub3JnLzwvdXJsPgorCSAgPC9vcmdhbml6YXRpb24+CisgICAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgIDwvbGljZW5zZXM+CisgICAgPC9wcm9qZWN0PgorICA8L3N1cHBsZW1lbnQ+Cis8L3N1cHBsZW1lbnRhbERhdGFNb2RlbHM+CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW5zLXBvbS90YXJnZXQvbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GL0RFUEVOREVOQ0lFUyBiL21hdmVuLXBsdWdpbnMtcG9tL3RhcmdldC9tYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXMvTUVUQS1JTkYvREVQRU5ERU5DSUVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZWJlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW5zLXBvbS90YXJnZXQvbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GL0RFUEVOREVOQ0lFUwpAQCAtMCwwICsxLDExIEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgcHJvamVjdCBkZXRlcm1pbmVkIGZyb20gdGhlCisvLyBtYXZlbiBwb20gb3JnYW5pemVkIGJ5IG9yZ2FuaXphdGlvbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcGFjaGUgU2VydmljZU1peAorCisKKworCisKZGlmZiAtLWdpdCBhL2NoZWNrc3VtLW1hdmVuLXBsdWdpbi9MSUNFTlNFIGIvbWF2ZW4tcGx1Z2lucy1wb20vdGFyZ2V0L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNoZWNrc3VtLW1hdmVuLXBsdWdpbi9MSUNFTlNFCnJlbmFtZSB0byBtYXZlbi1wbHVnaW5zLXBvbS90YXJnZXQvbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbnMtcG9tL3RhcmdldC9tYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFIGIvbWF2ZW4tcGx1Z2lucy1wb20vdGFyZ2V0L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhMjNhZgotLS0gL2Rldi9udWxsCisrKyBiL21hdmVuLXBsdWdpbnMtcG9tL3RhcmdldC9tYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCkBAIC0wLDAgKzEsOCBAQAorCitBcGFjaGUgU2VydmljZU1peAorQ29weXJpZ2h0IDIwMDUtMjAxNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAorVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KKworCmRpZmYgLS1naXQgYS9wb20ueG1sIGIvcG9tLnhtbAppbmRleCAxMTVmYmMzLi41MWUyNzA5IDEwMDY0NAotLS0gYS9wb20ueG1sCisrKyBiL3BvbS54bWwKQEAgLTM2LDE5ICszNiwxNCBAQAogCiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnBsdWdpbnMucG9tPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgogICAgIDxuYW1lPkFwYWNoZSBTZXJ2aWNlTWl4IDo6IFBsdWdpbnM8L25hbWU+CiAKICAgICA8bW9kdWxlcz4KICAgICAgICAgPG1vZHVsZT5tYXZlbi1wbHVnaW5zLXBvbTwvbW9kdWxlPgogICAgICAgICAKLSAgICAgICAgPG1vZHVsZT5jaGVja3N1bS1tYXZlbi1wbHVnaW48L21vZHVsZT4KICAgICAgICAgPG1vZHVsZT5kZXBlbmRzLW1hdmVuLXBsdWdpbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmpiaS1tYXZlbi1wbHVnaW48L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5yZXMtbWF2ZW4tcGx1Z2luPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+c2VydmljZW1peC1idWlsZDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPnhmaXJlLW1hdmVuLXBsdWdpbjwvbW9kdWxlPgogICAgIDwvbW9kdWxlcz4KIAogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcmVzLW1hdmVuLXBsdWdpbi9MSUNFTlNFIGIvcmVzLW1hdmVuLXBsdWdpbi9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiMTI3Li4wMDAwMDAwCi0tLSBhL3Jlcy1tYXZlbi1wbHVnaW4vTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS9yZXMtbWF2ZW4tcGx1Z2luL05PVElDRSBiL3Jlcy1tYXZlbi1wbHVnaW4vTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjIxMmM0Li4wMDAwMDAwCi0tLSBhL3Jlcy1tYXZlbi1wbHVnaW4vTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICA9PSAgTk9USUNFIGZpbGUgZm9yIHVzZSB3aXRoIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgID09Ci0gICA9PSAgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIFNlcnZpY2VNaXggZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgID09Ci0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFRoaXMgcHJvZHVjdCBjb250YWlucyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQpkaWZmIC0tZ2l0IGEvcmVzLW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvcmVzLW1hdmVuLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjFjMjAxLi4wMDAwMDAwCi0tLSBhL3Jlcy1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci08IS0tCi0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2lucy1wb208L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MzwvdmVyc2lvbj4KLSAgICA8cmVsYXRpdmVQYXRoPi4uL21hdmVuLXBsdWdpbnMtcG9tL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4gICAgCi0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnJlcy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjQuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgCi0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBTZXJ2aWNlTWl4IDo6IFBsdWdpbnMgOjogTWF2ZW4yIFJlc291cmNlIFBsdWdpbjwvbmFtZT4KLSAgCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NlcnZpY2VtaXgvbWF2ZW4tcGx1Z2lucy9yZXMtbWF2ZW4tcGx1Z2luL3RydW5rPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvc2VydmljZW1peC9tYXZlbi1wbHVnaW5zL3Jlcy1tYXZlbi1wbHVnaW4vdHJ1bms8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvc2VydmljZW1peC9tYXZlbi1wbHVnaW5zL3Jlcy1tYXZlbi1wbHVnaW4vdHJ1bms8L3VybD4KLSAgPC9zY20+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC45PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoaXZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS41LjU8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNjcmlwdC1hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPHByb2ZpbGVzPgotICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gV2Ugd2FudCB0byBkZXBsb3kgdGhlIGFydGlmYWN0IHRvIGEgc3RhZ2luZyBsb2NhdGlvbiBmb3IgcGVydXNhbCAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbHREZXBsb3ltZW50UmVwb3NpdG9yeT4ke2RlcGxveS5hbHRSZXBvc2l0b3J5fTwvYWx0RGVwbG95bWVudFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVwZGF0ZVJlbGVhc2VJbmZvPnRydWU8L3VwZGF0ZVJlbGVhc2VJbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSB3YW50IHRvIHNpZ24gdGhlIGFydGlmYWN0LCB0aGUgUE9NLCBhbmQgYWxsIGF0dGFjaGVkIGFydGlmYWN0cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXNzcGhyYXNlPiR7Z3BnLnBhc3NwaHJhc2V9PC9wYXNzcGhyYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5kZXBsb3k8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxkZWZhdWx0R29hbD5kZXBsb3k8L2RlZmF1bHRHb2FsPgotICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRhY2g+dHJ1ZTwvYXR0YWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0YWNoPnRydWU8L2F0dGFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgPC9wcm9maWxlcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9yZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9yZXMvSW50ZXJwb2xhdGlvbkZpbHRlclJlYWRlci5qYXZhIGIvcmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vcmVzL0ludGVycG9sYXRpb25GaWx0ZXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlMWI0NC4uMDAwMDAwMAotLS0gYS9yZXMtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9yZXMvSW50ZXJwb2xhdGlvbkZpbHRlclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5zZXJ2aWNlbWl4Lm1hdmVuLnBsdWdpbi5yZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbHRlclJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJwb2xhdGlvbkZpbHRlclJlYWRlciBleHRlbmRzIEZpbHRlclJlYWRlciB7Ci0gICAgLyoqIHJlcGxhY2VtZW50IHRleHQgZnJvbSBhIHRva2VuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZURhdGE7Ci0KLSAgICAvKiogSW5kZXggaW50byByZXBsYWNlbWVudCBkYXRhICovCi0gICAgcHJpdmF0ZSBpbnQgcmVwbGFjZUluZGV4ID0gLTE7Ci0KLSAgICAvKiogSGFzaHRhYmxlIHRvIGhvbGQgdGhlIHJlcGxhY2VlLXJlcGxhY2VyIHBhaXJzIChTdHJpbmcgdG8gU3RyaW5nKS4gKi8KLSAgICBwcml2YXRlIE1hcCB2YXJpYWJsZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqIENoYXJhY3RlciBtYXJraW5nIHRoZSBiZWdpbm5pbmcgb2YgYSB0b2tlbi4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBiZWdpblRva2VuOwotCi0gICAgLyoqIENoYXJhY3RlciBtYXJraW5nIHRoZSBlbmQgb2YgYSB0b2tlbi4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBlbmRUb2tlbjsKLQotICAgIC8qKiBMZW5ndGggb2YgYmVnaW4gdG9rZW4uICovCi0gICAgcHJpdmF0ZSBpbnQgYmVnaW5Ub2tlbkxlbmd0aDsKLQotICAgIC8qKiBMZW5ndGggb2YgZW5kIHRva2VuLiAqLwotICAgIHByaXZhdGUgaW50IGVuZFRva2VuTGVuZ3RoOwotCi0gICAgcHVibGljIEludGVycG9sYXRpb25GaWx0ZXJSZWFkZXIoUmVhZGVyIGluLCBNYXAgdmFyaWFibGVzLCBTdHJpbmcgYmVnaW5Ub2tlbiwgU3RyaW5nIGVuZFRva2VuKSB7Ci0gICAgICAgIHN1cGVyKGluKTsKLQotICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlczsKLSAgICAgICAgdGhpcy5iZWdpblRva2VuID0gYmVnaW5Ub2tlbjsKLSAgICAgICAgdGhpcy5lbmRUb2tlbiA9IGVuZFRva2VuOwotCi0gICAgICAgIGJlZ2luVG9rZW5MZW5ndGggPSBiZWdpblRva2VuLmxlbmd0aCgpOwotICAgICAgICBlbmRUb2tlbkxlbmd0aCA9IGVuZFRva2VuLmxlbmd0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNraXBzIGNoYXJhY3RlcnMuICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHNvbWUgY2hhcmFjdGVycyBhcmUKLSAgICAgKiBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgICAqCi0gICAgICogQHBhcmFtICBuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcAotICAgICAqCi0gICAgICogQHJldHVybiAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgc2tpcHBlZAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiA8Y29kZT5uPC9jb2RlPiBpcyBuZWdhdGl2ZS4KLSAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobiA8IDBMKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJza2lwIHZhbHVlIGlzIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGxvbmcgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChyZWFkKCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBjaGFyYWN0ZXJzIGludG8gYSBwb3J0aW9uIG9mIGFuIGFycmF5LiAgVGhpcyBtZXRob2Qgd2lsbCBibG9jawotICAgICAqIHVudGlsIHNvbWUgaW5wdXQgaXMgYXZhaWxhYmxlLCBhbiBJL08gZXJyb3Igb2NjdXJzLCBvciB0aGUgZW5kIG9mIHRoZQotICAgICAqIHN0cmVhbSBpcyByZWFjaGVkLgotICAgICAqCi0gICAgICogQHBhcmFtICAgICAgY2J1ZiAgRGVzdGluYXRpb24gYnVmZmVyIHRvIHdyaXRlIGNoYXJhY3RlcnMgdG8uCi0gICAgICogICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHBhcmFtICAgICAgb2ZmICAgT2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHN0b3JpbmcgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gICAgICBsZW4gICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHJlYWQoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGludCBjaCA9IHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNidWZbb2ZmICsgaV0gPSAoY2hhciljaDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0sIHJlcGxhY2luZyB0b2tlbnMKLSAgICAgKiBmcm9tIHRoZSBvcmlnaW5hbCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKLSAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgotICAgICAqIGR1cmluZyByZWFkaW5nCi0gICAgICovCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlcGxhY2VJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgaW50IGNoID0gcmVwbGFjZURhdGEuY2hhckF0KHJlcGxhY2VJbmRleCsrKTsKLSAgICAgICAgICAgIGlmIChyZXBsYWNlSW5kZXggPj0gcmVwbGFjZURhdGEubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICByZXBsYWNlSW5kZXggPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjaCA9IGluLnJlYWQoKTsKLQotICAgICAgICBpZiAoY2ggPT0gYmVnaW5Ub2tlbi5jaGFyQXQoMCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBrZXkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIGludCBiZWdpblRva2VuTWF0Y2hQb3MgPSAxOwotCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgY2ggPSBpbi5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleS5hcHBlbmQoKGNoYXIpY2gpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoYmVnaW5Ub2tlbk1hdGNoUG9zIDwgYmVnaW5Ub2tlbkxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChjaCAhPSBiZWdpblRva2VuLmNoYXJBdChiZWdpblRva2VuTWF0Y2hQb3MrKykpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IC0xOyAvLyBub3QgcmVhbGx5IEVPRiBidXQgdG8gdHJpZ2dlciBjb2RlIGJlbG93Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKGNoICE9IGVuZFRva2VuLmNoYXJBdCgwKSk7Ci0KLSAgICAgICAgICAgIC8vIG5vdyB0ZXN0IGVuZFRva2VuCi0gICAgICAgICAgICBpZiAoY2ggIT0gLTEgJiYgZW5kVG9rZW5MZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVuZFRva2VuTWF0Y2hQb3MgPSAxOwotCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleS5hcHBlbmQoKGNoYXIpY2gpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gZW5kVG9rZW4uY2hhckF0KGVuZFRva2VuTWF0Y2hQb3MrKykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IC0xOyAvLyBub3QgcmVhbGx5IEVPRiBidXQgdG8gdHJpZ2dlciBjb2RlIGJlbG93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoZW5kVG9rZW5NYXRjaFBvcyA8IGVuZFRva2VuTGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJlYWQgc28gd2UgaGF2ZSB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBiZWdpbi9lbmQgdG9rZW4KLSAgICAgICAgICAgIC8vIGFyZSBpbiBmYWN0IHRoZSBzYW1lIGFuZCBhcyB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcmVhZCB3ZSBoYXZlIGdvdCBvdXJzZWx2ZXMKLSAgICAgICAgICAgIC8vIGVuZCBvZiBhIHRva2VuIGJvdW5kYXJ5IHNvIGxldCBpdCBwYXNzIHRocm91Z2guCi0gICAgICAgICAgICBpZiAoY2ggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXBsYWNlRGF0YSA9IGtleS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHJlcGxhY2VJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJlZ2luVG9rZW4uY2hhckF0KDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgdmFyaWFibGVLZXkgPSBrZXkuc3Vic3RyaW5nKGJlZ2luVG9rZW5MZW5ndGggLSAxLCBrZXkubGVuZ3RoKCkgLSBlbmRUb2tlbkxlbmd0aCk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBvID0gdmFyaWFibGVzLmdldCh2YXJpYWJsZUtleSk7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gby50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VEYXRhID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZWFkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcGxhY2VEYXRhID0ga2V5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVwbGFjZUluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVnaW5Ub2tlbi5jaGFyQXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2g7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vcmVzL1Jlc01vam8uamF2YSBiL3Jlcy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL3Jlcy9SZXNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Y2ExZDkuLjAwMDAwMDAKLS0tIGEvcmVzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4vcmVzL1Jlc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4ucmVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLQotLyoqCi0gKiBDb3B5IHJlc291cmNlcyBmb3IgdGhlIG1haW4gc291cmNlIGNvZGUgdG8gdGhlIG1haW4gb3V0cHV0IGRpcmVjdG9yeS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z25vZGV0IFthdF0gZ21haWwub3JnIj5HdWlsbGF1bWUgTm9kZXQ8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1pY2hhbC5tYWN6a2FAZGltYXRpY3MuY29tIj5NaWNoYWwgTWFjemthPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AbWF2ZW4ub3JnIj5KYXNvbiB2YW4gWnlsPC9hPgotICogQGF1dGhvciBBbmRyZWFzIEhvaGVuZWRlcgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgcmVzb3VyY2VzCi0gKiBAcGhhc2UgcHJvY2Vzcy1yZXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIFJlc01vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8gewotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJhY3RlciBlbmNvZGluZyBzY2hlbWUgdG8gYmUgYXBwbGllZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGlzdCBvZiByZXNvdXJjZXMgd2Ugd2FudCB0byB0cmFuc2Zlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb3V0cHV0IGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRvIGNvcHkgdGhlIHJlc291cmNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OyAvLyBOT1BNRAotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmVnaW5Ub2tlbiA9ICJAeyI7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGVuZFRva2VuID0gIn0iOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGZpbHRlcnM7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCB8fCBlbmNvZGluZy5sZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIlVzaW5nIGRlZmF1bHQgZW5jb2RpbmcgdG8gY29weSBmaWx0ZXJlZCByZXNvdXJjZXMuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJVc2luZyAnIiArIGVuY29kaW5nICsgIicgdG8gY29weSBmaWx0ZXJlZCByZXNvdXJjZXMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFuZXcgRmlsZShpbnB1dERpcmVjdG9yeSkuZXhpc3RzKCkgfHwgIW5ldyBGaWxlKGlucHV0RGlyZWN0b3J5KS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS53YXJuKCJJbnB1dCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3RzLiBFeGl0aW5nIHBsdWdpbi4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICBzY2FubmVyLnNldEJhc2VkaXIoaW5wdXREaXJlY3RvcnkpOwotICAgICAgICBzY2FubmVyLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7IioqLyoqIiB9KTsKLSAgICAgICAgc2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgICAgc2Nhbm5lci5zY2FuKCk7Ci0gICAgICAgIExpc3QgaW5jbHVkZWRGaWxlcyA9IEFycmF5cy5hc0xpc3Qoc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCkpOwotCi0gICAgICAgIGdldExvZygpLmluZm8oIkNvcHlpbmcgIiArIGluY2x1ZGVkRmlsZXMuc2l6ZSgpICsgIiByZXNvdXJjZSIgKyAoaW5jbHVkZWRGaWxlcy5zaXplKCkgPiAxID8gInMiIDogIiIpKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBpbmNsdWRlZEZpbGVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBqLm5leHQoKTsKLSAgICAgICAgICAgIEZpbGUgc291cmNlID0gbmV3IEZpbGUoaW5wdXREaXJlY3RvcnksIG5hbWUpOwotICAgICAgICAgICAgRmlsZSBkZXN0aW5hdGlvbkZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnksIG5hbWUpOwotICAgICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbkZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgZGVzdGluYXRpb25GaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29weUZpbGUoc291cmNlLCBkZXN0aW5hdGlvbkZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBjb3B5aW5nIHJlc291cmNlICIgKyBzb3VyY2UsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKEZpbGUgZnJvbSwgZmluYWwgRmlsZSB0bykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVV0aWxzLkZpbHRlcldyYXBwZXJbXSB3cmFwcGVycyA9IG5ldyBGaWxlVXRpbHMuRmlsdGVyV3JhcHBlcltdIHsKLSAgICAgICAgICAgIC8vIHN1cHBvcnQgQHRva2VuQAotICAgICAgICAgICAgbmV3IEZpbGVVdGlscy5GaWx0ZXJXcmFwcGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKFJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnBvbGF0aW9uRmlsdGVyUmVhZGVyKHJlYWRlciwgZmlsdGVycywgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGZyb20sIHRvLCBlbmNvZGluZywgd3JhcHBlcnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VtaXgtYnVpbGQvTElDRU5TRSBiL3NlcnZpY2VtaXgtYnVpbGQvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwNTdmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlbWl4LWJ1aWxkL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyNzU0ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFQQUNIRSBTRVJWSUNFTUlYIFBBQ0tBR0VTCi0KLVRoZSBBcGFjaGUgU2VydmljZU1peCBkaXN0cmlidXRpb24gaW5jbHVkZXMgYSBudW1iZXIgb2YgZGVwZW5kZW50IHBhY2thZ2VzIHdpdGgKLXNlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlIGNvZGUgZm9yIAotdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nIAotbGljZW5zZXMuIAotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgQ2xhc3N3b3JsZCBMaWNlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qCi0kSWQ6IExJQ0VOU0UudHh0LHYgMS4xLjEuMSAyMDA0LzA3LzAxIDEzOjU5OjEzIGp2YW56eWwgRXhwICQKLQotQ29weXJpZ2h0IDIwMDIgKEMpIFRoZSBDb2RlaGF1cy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJjbGFzc3dvcmxkcyIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIAotICBjb250YWN0IGJvYkBjb2RlaGF1cy5vcmcuCi0KLTQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJjbGFzc3dvcmxkcyIKLSAgbm9yIG1heSAiY2xhc3N3b3JsZHMiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJjbGFzc3dvcmxkcyIgaXMgYSByZWdpc3RlcmVkCi0gIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLTUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cy4KLSAgKGh0dHA6Ly9jbGFzc3dvcmxkcy5jb2RlaGF1cy5vcmcvKS4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLU5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLVRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLUlORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi1TRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLVNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLU9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotKi8KLSAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIEJvdW5jeSBDYXN0bGUgTGljZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgQm91bmN5IENhc3RsZSBMaWNlbnNlCi0KLUNvcHlyaWdodCAoYykgMjAwMC0yMDA1IFRoZSBMZWdpb24gT2YgVGhlIEJvdW5jeSBDYXN0bGUgKGh0dHA6Ly93d3cuYm91bmN5Y2FzdGxlLm9yZykKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCi1hbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCi1pbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKLXN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCi1wb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsCi1JTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi1MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgotREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBDb25jdXJyZW50IExpY2Vuc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVEVDSE5PTE9HWSBMSUNFTlNFIEZST00gU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBUTyBET1VHIExFQQotCi1XaGVyZWFzIERvdWcgTGVhIGRlc2lyZXMgdG8gdXRsaXplZCBjZXJ0YWluIEphdmEgU29mdHdhcmUgdGVjaG5vbG9naWVzIAotaW4gdGhlIHV0aWwuY29uY3VycmVudCB0ZWNobm9sb2d5OyBhbmQgV2hlcmVhcyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIAotKCJTdW4iKSBkZXNpcmVzIHRoYXQgRG91ZyBMZWEgdXRpbGl6ZSBjZXJ0YWluIEphdmEgU29mdHdhcmUgdGVjaG5vbG9naWVzIAotaW4gdGhlIHV0aWwuY29uY3VycmVudCB0ZWNobm9sb2d5OwotCi1UaGVyZWZvcmUgdGhlIHBhcnRpZXMgYWdyZWUgYXMgZm9sbG93cywgZWZmZWN0aXZlIE1heSAzMSwgMjAwMjogIkphdmEgCi1Tb2Z0d2FyZSB0ZWNobm9sb2dpZXMiIG1lYW5zIGNsYXNzZXMvamF2YS91dGlsL0FycmF5TGlzdC5qYXZhLCBhbmQgCi1jbGFzc2VzL2phdmEvdXRpbC9IYXNoTWFwLmphdmEuCi0KLVRoZSBKYXZhIFNvZnR3YXJlIHRlY2hub2xvZ2llcyBhcmUgQ29weXJpZ2h0IChjKSAxOTk0LTIwMDAgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTdW4gaGVyZWJ5IGdyYW50cyBEb3VnIExlYSBhIAotbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCBub24tdHJhbnNmZXJyYWJsZSBsaWNlbnNlIHRvIHVzZSwgcmVwcm9kdWNlLCAKLWNyZWF0ZSBkZXJpdmF0ZSB3b3JrcyBvZiwgYW5kIGRpc3RyaWJ1dGUgdGhlIEphdmEgU29mdHdhcmUgYW5kIGRlcml2YXRpdmUgCi13b3JrcyB0aGVyZW9mIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFzIHBhcnQgb2YgYSBsYXJnZXIgd29yaywgYW5kIAotdG8gc3VibGljZW5zZSB0aGUgcmlnaHQgdG8gdXNlLCByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgdGhlIEphdmEgU29mdHdhcmUgCi1hbmQgRG91ZyBMZWEncyBkZXJpdmF0aXZlIHdvcmtzIGFzIHRoZSBwYXJ0IG9mIGxhcmdlciB3b3JrcyB0aHJvdWdoIAotbXVsdGlwbGUgdGllcnMgb2Ygc3VibGljZW5zZWVzIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotYXJlIG1ldDoKLQotLU5laXRoZXIgdGhlIG5hbWUgb2Ygb3IgdHJhZGVtYXJrcyBvZiBTdW4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAKLSBwcm9tb3RlIHByb2R1Y3RzIGluY2x1ZGluZyBvciBkZXJpdmVkIGZyb20gdGhlIEphdmEgU29mdHdhcmUgdGVjaG5vbG9neSAKLSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbjsgYW5kCi0tUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBvciBiaW5hcnkgY29kZSBtdXN0IGNvbnRhaW4gdGhlIGFib3ZlIAotIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzOgotCi1UaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJBUyBJUywiIHdpdGhvdXQgYSB3YXJyYW50eSBvZiBhbnkga2luZC4gQUxMIAotRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIAotQU5ZIElNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKLU9SIE5PTi1JTkZSSU5HRU1FTlQsIEFSRSBIRVJFQlkgRVhDTFVERUQuIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gQU5EIElUUyAKLUxJQ0VOU09SUyBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgREFNQUdFUyBTVUZGRVJFRCBCWSBMSUNFTlNFRSBBUyBBIAotUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcgT1IgRElTVFJJQlVUSU5HIFRIRSBTT0ZUV0FSRSBPUiBJVFMgCi1ERVJJVkFUSVZFUy4gSU4gTk8gRVZFTlQgV0lMTCBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIE9SIElUUyBMSUNFTlNPUlMgQkUgCi1MSUFCTEUgRk9SIEFOWSBMT1NUIFJFVkVOVUUsIFBST0ZJVCBPUiBEQVRBLCBPUiBGT1IgRElSRUNULCBJTkRJUkVDVCwgCi1TUEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZFIERBTUFHRVMsIEhPV0VWRVIgQ0FVU0VEIAotQU5EIFJFR0FSRExFU1MgT0YgVEhFIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgT1IgCi1JTkFCSUxJVFkgVE8gVVNFIFNPRlRXQVJFLCBFVkVOIElGIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gSEFTIEJFRU4gCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLVlvdSBhY2tub3dsZWRnZSB0aGF0IFNvZnR3YXJlIGlzIG5vdCBkZXNpZ25lZCwgbGljZW5zZWQgb3IgaW50ZW5kZWQgZm9yIAotdXNlIGluIHRoZSBkZXNpZ24sIGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyIAotZmFjaWxpdHkuCi0KLXNpZ25lZCBbRG91ZyBMZWFdIGRhdGVkCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIFhGaXJlIExpY2Vuc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ29weXJpZ2h0IChjKSAyMDA1IEVudm9pIFNvbHV0aW9ucyBMTEMKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCAKLXRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gCi10aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgCi1hbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgCi1Tb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiAKLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiAKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCAKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIAotVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyAKLUZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgCi1ERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE1YNEogTGljZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgTVg0SiBMaWNlbnNlLCBWZXJzaW9uIDEuMAotCi1Db3B5cmlnaHQgKGMpIDIwMDEgTVg0Si4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgIE1YNEogcHJvamVjdCAoaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9teDRqKS4iCi0gICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotCi00LiBUaGUgbmFtZXMgIk1YNEoiIGFuZCAibXg0aiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gICBiaW9ybl9zdGVlZG9tQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotCi01LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiTVg0SiIsCi0gICBub3IgbWF5ICJNWDRKIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICBwZXJtaXNzaW9uIG9mIFNpbW9uZSBCb3JkZXQuCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi1PRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDSFJJUyBTRUdVSU4gT1IKLUlUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLVVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLU9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi1PRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLVNVQ0ggREFNQUdFLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIE1YNEouICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgotTVg0SiwgcGxlYXNlIHNlZSA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9teDRqPi4KLQotCi0gICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBXU0RMNEogTGljZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAgCi0KLQotVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiAKLVBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIAotUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULiAKLQotCi0xLiBERUZJTklUSU9OUyAKLQotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6IAotCi1hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgCi0gICBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKLQotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgotCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKLQotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKLQotd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSAKLWRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIAotZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIAotaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgCi1pbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gCi1saWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAKLQotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLiAKLQotCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggCi1hcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIAotd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAKLQotCi0iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgCi1BZ3JlZW1lbnQuIAotCi0KLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIAotaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuIAotCi0KLTIuIEdSQU5UIE9GIFJJR0hUUyAKLQotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyAKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIAotcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IAotcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIAotaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4KLQotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyAKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIAotTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIAotdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCAKLW9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSAKLUNvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgCi10aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiAKLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgCi10byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIAotaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAKLQotYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIAotdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IAotQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIAotaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyAKLWFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIAotaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byAKLWV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSAKLWFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgCi1uZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gCi1hbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgCi10byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgotCi1kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IAotY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSAKLXNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KLSAKLTMuIFJFUVVJUkVNRU5UUyAKLQotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciAKLWl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6IAotCi1hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKLSAgIAotaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCAKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSAKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgCi0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciAKLWRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIAotZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IAotCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIAotYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCi0KLWl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCAKLUNvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIAotb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4gCi0KLVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTogCi0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCAKLQotYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIAotCi1Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gCi10aGUgUHJvZ3JhbS4gCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIAotQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCAKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gCi0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OIAotCi1Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyAKLXdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyAKLWxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSAKLUNvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyAKLXNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IgCi1vdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIAotY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIAotaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIAotQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIAotYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIAotcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgCi1vciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZSAKLW9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgCi10byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gCi1xdWFsaWZ5LCAKLWFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCAKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIAotQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCAKLXRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIAotQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4gCi0KLQotRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgCi1wcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCAKLW9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIAotdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgCi1hZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIAotd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgCi1kYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLiAKLQotCi01LiBOTyBXQVJSQU5UWSAKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIAotT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiAKLUVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgCi1DT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSAKLVBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyAKLXRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgCi1yaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gCi0KLQotNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkgCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIAotQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gCi1MT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCi1DT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIAotRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gCi0KLQotNy4gR0VORVJBTCAKLQotSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgCi10aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gCi1ieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIAotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4gCi0KLQotSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggCi1yZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIAotY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgCi1Db250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgCi1vZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgCi1pbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gCi1vciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIAotY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyAKLXN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgCi1TZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gCi0KLQotQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgCi10byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgCi1hbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIAotYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgCi1BZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSAKLVByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyAKLXVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIAotUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gCi0KLQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCAKLWJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSAKLW9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyAKLXRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgCi1mcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgCi10byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gSUJNIG1heSAKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgCi1zZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgCi1kaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgCi1hbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIAotaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIAotcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyAKLUNvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gCi1TZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIAotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gCi1ub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiAKLQotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSAKLWludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgCi1BZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgCi1hZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSAKLXRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4gCi0KLQotICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgWFN0cmVhbSBMaWNlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBKb2UgV2FsbmVzCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgCi1tZXQ6Ci0KLVJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCi10aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gCi1iaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIAotY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciAKLW1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLU5laXRoZXIgdGhlIG5hbWUgb2YgWFN0cmVhbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgCi10byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIAotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgCi1QQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgCi1PUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIAotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIAotUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIAotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAotU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gSmF2YSBNYWlsIExpY2Vuc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMAotCi0xLiBEZWZpbml0aW9ucy4KLQotICAgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdAotICAgICAgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLQotICAgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZQotICAgICAgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhCi0gICAgICBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAotICAgICAgcGFydGljdWxhciBDb250cmlidXRvci4KLQotICAgICAgMS4zLiAiQ292ZXJlZCBTb2Z0d2FyZSIgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IKLSAgICAgIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzCi0gICAgICBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZwotICAgICAgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotCi0gICAgICAxLjQuICJFeGVjdXRhYmxlIiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybQotICAgICAgb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4gCi0KLSAgICAgIDEuNS4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkKLSAgICAgIHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMKLSAgICAgIExpY2Vuc2UuIAotICAgICAgCi0gICAgICAxLjYuICJMYXJnZXIgV29yayIgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQKLSAgICAgIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUKLSAgICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgICAgMS43LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4KLQotICAgICAgMS44LiAiTGljZW5zYWJsZSIgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlCi0gICAgICBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbAotICAgICAgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzCi0gICAgICBjb252ZXllZCBoZXJlaW4uCi0gICAgICAKLSAgICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZQotICAgICAgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzogCi0KLSAgICAgICAgICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLAotICAgICAgICAgICAgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEKLSAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cwotICAgICAgICAgICAgTW9kaWZpY2F0aW9uczsgCi0KLSAgICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZQotICAgICAgICAgICAgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvciAKLQotICAgICAgICAgICAgQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUKLSAgICAgICAgICAgIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQKLSAgICAgIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMKLSAgICAgIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAKLQotICAgICAgMS4xMS4gIlBhdGVudCBDbGFpbXMiIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZAotICAgICAgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLAotICAgICAgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudAotICAgICAgTGljZW5zYWJsZSBieSBncmFudG9yLiAKLQotICAgICAgMS4xMi4gIlNvdXJjZSBDb2RlIiBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyCi0gICAgICBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKQotICAgICAgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgotCi0gICAgICAxLjEzLiAiWW91IiAob3IgIllvdXIiKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwKLSAgICAgIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZgotICAgICAgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIKLSAgICAgIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzCi0gICAgICB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMKLSAgICAgIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IKLSAgICAgIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAotICAgICAgZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcAotICAgICAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcwotICAgICAgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLTIuIExpY2Vuc2UgR3JhbnRzLiAKLQotICAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi0KLSAgICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kCi0gICAgICBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZQotICAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLAotICAgICAgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6IAotCi0gICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbgotICAgICAgICAgICAgcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwKLSAgICAgICAgICAgIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sCi0gICAgICAgICAgICBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IKLSAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywKLSAgICAgICAgICAgIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZCAKLQotICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsCi0gICAgICAgICAgICB1c2luZyBvciBzZWxsaW5nIG9mIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlCi0gICAgICAgICAgICBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vcgotICAgICAgICAgICAgb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcgotICAgICAgICAgICAgcG9ydGlvbnMgdGhlcmVvZikuIAotCi0gICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4xKGEpIGFuZCAoYikKLSAgICAgICAgICAgIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QKLSAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUKLSAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzCi0gICAgICAgICAgICBMaWNlbnNlLiAKLQotICAgICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50Ci0gICAgICAgICAgICBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbQotICAgICAgICAgICAgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoMikgZm9yIGluZnJpbmdlbWVudHMKLSAgICAgICAgICAgIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsCi0gICAgICAgICAgICBTb2Z0d2FyZSwgb3IgKGlpKSB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsCi0gICAgICAgICAgICBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuIAotCi0gICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotCi0gICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZAotICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoCi0gICAgICBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKLSAgICAgIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLQotICAgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4KLSAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8KLSAgICAgICAgICAgIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UKLSAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaAotICAgICAgICAgICAgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4KLSAgICAgICAgICAgIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMKLSAgICAgICAgICAgIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0gICAgICAgICAgICAKLQotICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsCi0gICAgICAgICAgICB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAotICAgICAgICAgICAgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoCi0gICAgICAgICAgICBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaAotICAgICAgICAgICAgY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLAotICAgICAgICAgICAgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKQotICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zCi0gICAgICAgICAgICB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24KLSAgICAgICAgICAgIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4gCi0KLSAgICAgICAgICAgIChjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9ucyAyLjIoYSkgYW5kCi0gICAgICAgICAgICAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdAotICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zCi0gICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4gCi0KLSAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudAotICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IKLSAgICAgICAgICAgIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKSBmb3IKLSAgICAgICAgICAgIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkKLSAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKSB0aGUKLSAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yCi0gICAgICAgICAgICB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUKLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKSB1bmRlcgotICAgICAgICAgICAgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUKLSAgICAgICAgICAgIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuIAotCi0zLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0KLSAgICAgIDMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotCi0gICAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlCi0gICAgICBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbgotICAgICAgU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUKLSAgICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QKLSAgICAgIGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlCi0gICAgICBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yCi0gICAgICBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueQotICAgICAgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4KLSAgICAgIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhCi0gICAgICByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQKLSAgICAgIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotICAgICAgMy4yLiBNb2RpZmljYXRpb25zLgotCi0gICAgICBUaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91Ci0gICAgICBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UKLSAgICAgIHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91cgotICAgICAgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvCi0gICAgICBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgMy4zLiBSZXF1aXJlZCBOb3RpY2VzLgotCi0gICAgICBZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zCi0gICAgICB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLgotICAgICAgWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvcgotICAgICAgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IKLSAgICAgIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcKLSAgICAgIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0KLSAgICAgIDMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KLQotICAgICAgWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgQ292ZXJlZAotICAgICAgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlCi0gICAgICBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzw5UKLSAgICAgIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEKLSAgICAgIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5Ci0gICAgICBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuCi0gICAgICBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uCi0gICAgICBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91Ci0gICAgICBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LAotICAgICAgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkKLSAgICAgIFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsCi0gICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkCi0gICAgICBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZgotICAgICAgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgotICAgIAotCi0gICAgICAzLjUuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotCi0gICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZAotICAgICAgU29mdHdhcmUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMKLSAgICAgIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMKLSAgICAgIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluCi0gICAgICBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUKLSAgICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdAotICAgICAgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudMOVcyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0KLSAgICAgIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UKLSAgICAgIGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIHVuZGVyIGEKLSAgICAgIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdAotICAgICAgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UKLSAgICAgIGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UKLSAgICAgIGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeQotICAgICAgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwKLSAgICAgIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zCi0gICAgICBZb3Ugb2ZmZXIuCi0KLSAgICAgIDMuNi4gTGFyZ2VyIFdvcmtzLgotCi0gICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlCi0gICAgICB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKLSAgICAgIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoCi0gICAgICBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZQotICAgICAgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuIAotICAgICAgCi00LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4gCi0KLSAgICAgIDQuMS4gTmV3IFZlcnNpb25zLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQKLSAgICAgIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UKLSAgICAgIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhCi0gICAgICBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluCi0gICAgICBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlCi0gICAgICByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLiAKLQotICAgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgotCi0gICAgICBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlCi0gICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgICB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkCi0gICAgICB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEKLSAgICAgIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZwotICAgICAgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueQotICAgICAgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZAotICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZAotICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0bwotICAgICAgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlCi0gICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlCi0gICAgICBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLiAKLQotICAgICAgNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KLQotICAgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYQotICAgICAgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZAotICAgICAgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSkgcmVuYW1lCi0gICAgICB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZQotICAgICAgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMKLSAgICAgIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKSBvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0Ci0gICAgICB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0gICAgICAKLQotNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KLQotQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIgotQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwKLUlOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQKLVNPRlRXQVJFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAotUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkKLUNPVkVSRUQgU09GVFdBUkUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUKLUlOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GCi1BTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRgotV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YKLUFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTCi1ESVNDTEFJTUVSLiAKLQotNi4gVEVSTUlOQVRJT04uIAotCi0gICAgICA2LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsCi0gICAgICB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcwotICAgICAgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YKLSAgICAgIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyCi0gICAgICBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mCi0gICAgICB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KLQotICAgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nCi0gICAgICBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yCi0gICAgICBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdAotICAgICAgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikKLSAgICAgIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZQotICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvcgotICAgICAgb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUKLSAgICAgIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkKLSAgICAgIHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvcgotICAgICAgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwKLSAgICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpCi0gICAgICBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlciBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBvZiB0aGlzCi0gICAgICBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQKLSAgICAgIHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uCi0gICAgICBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5Ci0gICAgICBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZQotICAgICAgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlcgotICAgICAgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aAotICAgICAgUGFydGljaXBhbnQuCi0KLSAgICAgIDYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDYuMSBvciA2LjIKLSAgICAgIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkCi0gICAgICBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbgotICAgICAgKGV4Y2x1ZGluZyBsaWNlbnNlcyBncmFudGVkIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpCi0gICAgICBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotCi03LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KLQotVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQKLShJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFCi1JTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YKLUNPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRQotTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVAotTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLCi1TVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIKLUNPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4KLUlORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRgotTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMCi1JTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWcOVUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQKLUFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETwotTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QKLUFQUExZIFRPIFlPVS4KLQotOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KLQotVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzCi1kZWZpbmVkIGluIDQ4IEMuRi5SLiAyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiAiY29tbWVyY2lhbAotY29tcHV0ZXIgc29mdHdhcmUiIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4gwqQKLTI1Mi4yMjctNzAxNChhKSgxKSkgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlCi1kb2N1bWVudGF0aW9uIiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuCi0xOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xCi10aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzCi1hY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLgotVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywKLWFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMKLUdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotOS4gTUlTQ0VMTEFORU9VUy4KLQotVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QKLW1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUKLXVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlCi1leHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZQotZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZQotY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50Ci1hcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaAotanVyaXNkaWN0aW9uw5VzIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBBbnkgbGl0aWdhdGlvbgotcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZgotdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhCi1ub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHdpdGggdGhlIGxvc2luZwotcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQKLWNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5c8OVIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUKLWFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlCi1JbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yCi1yZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwKLWJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuCi1Zb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlCi1Vbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQKLWNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsCi1kaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KLQotMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCi0KLUFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMKLXJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IKLWluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZQotYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0bwotZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZwotaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24KLW9mIGxpYWJpbGl0eS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSBKYXZhIEFjdGl2YXRpb24gRnJhbWV3b3JrIExpY2Vuc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wCi0KLTEuIERlZmluaXRpb25zLgotCi0gICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0Ci0gICAgICBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgotCi0gICAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlCi0gICAgICBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEKLSAgICAgIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0Ci0gICAgICBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0gICAgICAxLjMuICJDb3ZlcmVkIFNvZnR3YXJlIiBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvcgotICAgICAgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMKLSAgICAgIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nCi0gICAgICBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0KLSAgICAgIDEuNC4gIkV4ZWN1dGFibGUiIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtCi0gICAgICBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLiAKLQotICAgICAgMS41LiAiSW5pdGlhbCBEZXZlbG9wZXIiIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eQotICAgICAgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcwotICAgICAgTGljZW5zZS4gCi0gICAgICAKLSAgICAgIDEuNi4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZAotICAgICAgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZQotICAgICAgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgICAxLjcuICJMaWNlbnNlIiBtZWFucyB0aGlzIGRvY3VtZW50LgotCi0gICAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUKLSAgICAgIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsCi0gICAgICBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMKLSAgICAgIGNvbnZleWVkIGhlcmVpbi4KLSAgICAgIAotICAgICAgMS45LiAiTW9kaWZpY2F0aW9ucyIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlCi0gICAgICBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOiAKLQotICAgICAgICAgICAgQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sCi0gICAgICAgICAgICBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYQotICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzCi0gICAgICAgICAgICBNb2RpZmljYXRpb25zOyAKLQotICAgICAgICAgICAgQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlCi0gICAgICAgICAgICBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yIAotCi0gICAgICAgICAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZQotICAgICAgICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICAgIDEuMTAuICJPcmlnaW5hbCBTb2Z0d2FyZSIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZAotICAgICAgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcwotICAgICAgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuIAotCi0gICAgICAxLjExLiAiUGF0ZW50IENsYWltcyIgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkCi0gICAgICBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sCi0gICAgICBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50Ci0gICAgICBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuIAotCi0gICAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIKLSAgICAgIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpCi0gICAgICBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0KLSAgICAgIDEuMTMuICJZb3UiIChvciAiWW91ciIpIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbAotICAgICAgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mCi0gICAgICB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IgotICAgICAgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMKLSAgICAgIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcwotICAgICAgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdCBvcgotICAgICAgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoCi0gICAgICBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwCi0gICAgICBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzCi0gICAgICBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotMi4gTGljZW5zZSBHcmFudHMuIAotCi0gICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4KLQotICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQKLSAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlCi0gICAgICBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsCi0gICAgICByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZTogCi0KLSAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuCi0gICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLAotICAgICAgICAgICAgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwKLSAgICAgICAgICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcgotICAgICAgICAgICAgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLAotICAgICAgICAgICAgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kIAotCi0gICAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywKLSAgICAgICAgICAgIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUKLSAgICAgICAgICAgIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yCi0gICAgICAgICAgICBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yCi0gICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKS4gCi0KLSAgICAgICAgICAgIChjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9ucyAyLjEoYSkgYW5kIChiKQotICAgICAgICAgICAgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdAotICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZQotICAgICAgICAgICAgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMKLSAgICAgICAgICAgIExpY2Vuc2UuIAotCi0gICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQKLSAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tCi0gICAgICAgICAgICB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IgaW5mcmluZ2VtZW50cwotICAgICAgICAgICAgY2F1c2VkIGJ5OiAoaSkgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgICAgICAgIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgICAgICAgIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4gCi0KLSAgICAgIDIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCi0KLSAgICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kCi0gICAgICBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLAotICAgICAgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotCi0gICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbgotICAgICAgICAgICAgcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0bwotICAgICAgICAgICAgdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZQotICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoCi0gICAgICAgICAgICBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbgotICAgICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcwotICAgICAgICAgICAgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywKLSAgICAgICAgICAgIHVzaW5nLCBvciBzZWxsaW5nIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0Ci0gICAgICAgICAgICBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGgKLSAgICAgICAgICAgIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoCi0gICAgICAgICAgICBjb21iaW5hdGlvbiksIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsCi0gICAgICAgICAgICBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEpCi0gICAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMKLSAgICAgICAgICAgIHRoZXJlb2YpOyBhbmQgKDIpIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zCi0gICAgICAgICAgICBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbgotICAgICAgICAgICAgKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLiAKLQotICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQKLSAgICAgICAgICAgIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0Ci0gICAgICAgICAgICBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMKLSAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LiAKLQotICAgICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMihiKSBhYm92ZSwgbm8gcGF0ZW50Ci0gICAgICAgICAgICBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvcgotICAgICAgICAgICAgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvcgotICAgICAgICAgICAgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSB0aGlyZCBwYXJ0eQotICAgICAgICAgICAgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZQotICAgICAgICAgICAgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IKLSAgICAgICAgICAgIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZQotICAgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyCi0gICAgICAgICAgICBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZQotICAgICAgICAgICAgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4gCi0KLTMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KLQotICAgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0KLSAgICAgIEFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UKLSAgICAgIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluCi0gICAgICBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZQotICAgICAgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgbXVzdAotICAgICAgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUKLSAgICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3IKLSAgICAgIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YgYW55Ci0gICAgICBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbgotICAgICAgb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEKLSAgICAgIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZAotICAgICAgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi0gICAgICAzLjIuIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UKLSAgICAgIGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdQotICAgICAgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyCi0gICAgICBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8KLSAgICAgIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuCi0KLSAgICAgIFlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMKLSAgICAgIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uCi0gICAgICBZb3UgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50IG9yCi0gICAgICB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvcgotICAgICAgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZwotICAgICAgYXR0cmlidXRpb24gdG8gYW55IENvbnRyaWJ1dG9yIG9yIHRoZSBJbml0aWFsIERldmVsb3Blci4KLQotICAgICAgMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLgotCi0gICAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkCi0gICAgICBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUKLSAgICAgIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHPDlQotICAgICAgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYQotICAgICAgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkKLSAgICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4KLSAgICAgIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24KLSAgICAgIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UKLSAgICAgIG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksCi0gICAgICBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieQotICAgICAgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwKLSAgICAgIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQKLSAgICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mCi0gICAgICB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0gICAgCi0KLSAgICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCi0KLSAgICAgIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkCi0gICAgICBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcwotICAgICAgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcwotICAgICAgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4KLSAgICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZQotICAgICAgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0Ci0gICAgICBvciBhbHRlciB0aGUgcmVjaXBpZW50w5VzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybQotICAgICAgZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdQotICAgICAgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYQotICAgICAgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0Ci0gICAgICBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdQotICAgICAgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdQotICAgICAgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5Ci0gICAgICBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbAotICAgICAgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMKLSAgICAgIFlvdSBvZmZlci4KLQotICAgICAgMy42LiBMYXJnZXIgV29ya3MuCi0KLSAgICAgIFlvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgU29mdHdhcmUKLSAgICAgIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQotICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2gKLSAgICAgIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gCi0gICAgICAKLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLiAKLQotICAgICAgNC4xLiBOZXcgVmVyc2lvbnMuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZAotICAgICAgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZQotICAgICAgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEKLSAgICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4KLSAgICAgIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUKLSAgICAgIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuIAotCi0gICAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0KLSAgICAgIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UKLSAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQKLSAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYQotICAgICAgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nCi0gICAgICBkaXN0cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgYW55Ci0gICAgICBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kCi0gICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgICB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkCi0gICAgICB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvCi0gICAgICB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUKLSAgICAgIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUKLSAgICAgIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuIAotCi0gICAgICA0LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotCi0gICAgICBXaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhCi0gICAgICBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kCi0gICAgICB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUKLSAgICAgIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlCi0gICAgICBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycwotICAgICAgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQKLSAgICAgIHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4KLSAgICAgIAotCi01LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi1DT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiCi1CQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELAotSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRAotU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5ECi1QRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWQotQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRQotSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YKLUFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GCi1XQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRgotQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMKLURJU0NMQUlNRVIuIAotCi02LiBURVJNSU5BVElPTi4gCi0KLSAgICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwKLSAgICAgIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zCi0gICAgICBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZgotICAgICAgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIKLSAgICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YKLSAgICAgIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgotCi0gICAgICA2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcKLSAgICAgIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IKLSAgICAgIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0Ci0gICAgICB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKQotICAgICAgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlCi0gICAgICBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yCi0gICAgICBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZQotICAgICAgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueQotICAgICAgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yCi0gICAgICBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbAotICAgICAgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkKLSAgICAgIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMKLSAgICAgIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudAotICAgICAgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24KLSAgICAgIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkKLSAgICAgIHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAgICBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyCi0gICAgICB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoCi0gICAgICBQYXJ0aWNpcGFudC4KLQotICAgICAgNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMgotICAgICAgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQKLSAgICAgIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uCi0gICAgICAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikKLSAgICAgIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCi0KLTcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotCi1VTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUKLUlOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRgotQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFCi1MSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUCi1MSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NUIFBST0ZJVFMsIExPU1MgT0YgR09PRFdJTEwsIFdPUksKLVNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUgotQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgotSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GCi1MSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwKLUlOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZw5VTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVAotQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPCi1OT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVAotQVBQTFkgVE8gWU9VLgotCi04LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotCi1UaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhICJjb21tZXJjaWFsIGl0ZW0sIiBhcyB0aGF0IHRlcm0gaXMKLWRlZmluZWQgaW4gNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mICJjb21tZXJjaWFsCi1jb21wdXRlciBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDCpAotMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgImNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUKLWRvY3VtZW50YXRpb24iIGFzIHN1Y2ggdGVybXMgYXJlIHVzZWQgaW4gNDggQy5GLlIuIDEyLjIxMiAoU2VwdC4KLTE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEKLXRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMKLWFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uCi1UaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLAotYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcwotR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIgc29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi05LiBNSVNDRUxMQU5FT1VTLgotCi1UaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdAotbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQotdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUKLWV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlCi1nb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlCi1jb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQKLWFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoCi1qdXJpc2RpY3Rpb27DlXMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uCi1yZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mCi10aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEKLW5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nCi1wYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydAotY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzw5UgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZQotYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUKLUludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IKLXJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbAotYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMgTGljZW5zZS4KLVlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUKLVVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydAotY29udHJvbCBsYXdzIGFuZCByZWd1bGF0aW9uIG9mIGFueSBvdGhlciBjb3VudHJpZXMpIHdoZW4gWW91IHVzZSwKLWRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgotCi0xMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcwotcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvcgotaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlCi1hbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvCi1kaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nCi1oZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbgotb2YgbGlhYmlsaXR5LgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09IEpBWEIgTGljZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjAKLQotMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQKLSAgICAgIGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgIDEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUKLSAgICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYQotICAgICAgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgIHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi0KLSAgICAgIDEuMy4gIkNvdmVyZWQgU29mdHdhcmUiIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yCi0gICAgICAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcwotICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcKLSAgICAgIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotICAgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0KLSAgICAgIG90aGVyIHRoYW4gU291cmNlIENvZGUuIAotCi0gICAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5Ci0gICAgICB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzCi0gICAgICBMaWNlbnNlLiAKLSAgICAgIAotICAgICAgMS42LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkCi0gICAgICBTb2Z0d2FyZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlCi0gICAgICB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICAgIDEuNy4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgIDEuOC4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZQotICAgICAgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwKLSAgICAgIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cwotICAgICAgY29udmV5ZWQgaGVyZWluLgotICAgICAgCi0gICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUKLSAgICAgIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6IAotCi0gICAgICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywKLSAgICAgICAgICAgIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhCi0gICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMKLSAgICAgICAgICAgIE1vZGlmaWNhdGlvbnM7IAotCi0gICAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUKLSAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IgCi0KLSAgICAgICAgICAgIEMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlCi0gICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgICAgMS4xMC4gIk9yaWdpbmFsIFNvZnR3YXJlIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kCi0gICAgICBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzCi0gICAgICBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4gCi0KLSAgICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQKLSAgICAgIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwKLSAgICAgIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQKLSAgICAgIExpY2Vuc2FibGUgYnkgZ3JhbnRvci4gCi0KLSAgICAgIDEuMTIuICJTb3VyY2UgQ29kZSIgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlcgotICAgICAgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikKLSAgICAgIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KLQotICAgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsCi0gICAgICBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YKLSAgICAgIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiCi0gICAgICBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcwotICAgICAgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzCi0gICAgICBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yCi0gICAgICBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKLSAgICAgIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAKLSAgICAgIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMKLSAgICAgIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0yLiBMaWNlbnNlIEdyYW50cy4gCi0KLSAgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgotCi0gICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZAotICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUKLSAgICAgIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKLSAgICAgIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOiAKLQotICAgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4KLSAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsCi0gICAgICAgICAgICB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLAotICAgICAgICAgICAgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yCi0gICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsCi0gICAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgCi0KLSAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLAotICAgICAgICAgICAgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZQotICAgICAgICAgICAgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3IKLSAgICAgICAgICAgIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IKLSAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLiAKLQotICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpCi0gICAgICAgICAgICBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0Ci0gICAgICAgICAgICBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlCi0gICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcwotICAgICAgICAgICAgTGljZW5zZS4gCi0KLSAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudAotICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20KLSAgICAgICAgICAgIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvciBpbmZyaW5nZW1lbnRzCi0gICAgICAgICAgICBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICAgICAgICAgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICAgICAgICAgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLiAKLQotICAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KLQotICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQKLSAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaAotICAgICAgQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsCi0gICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0KLSAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuCi0gICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvCi0gICAgICAgICAgICB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlCi0gICAgICAgICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2gKLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuCi0gICAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzCi0gICAgICAgICAgICBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLAotICAgICAgICAgICAgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aAotICAgICAgICAgICAgaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2gKLSAgICAgICAgICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwKLSAgICAgICAgICAgIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSkKLSAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucwotICAgICAgICAgICAgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMKLSAgICAgICAgICAgIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uCi0gICAgICAgICAgICAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuIAotCi0gICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZAotICAgICAgICAgICAgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QKLSAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuIAotCi0gICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQKLSAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yCi0gICAgICAgICAgICBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAoMikgZm9yCi0gICAgICAgICAgICBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkIHBhcnR5Ci0gICAgICAgICAgICBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlCi0gICAgICAgICAgICBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvcgotICAgICAgICAgICAgd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlCi0gICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMykgdW5kZXIKLSAgICAgICAgICAgIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlCi0gICAgICAgICAgICBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLiAKLQotMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotCi0gICAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLQotICAgICAgQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZQotICAgICAgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4KLSAgICAgIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlCi0gICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0Ci0gICAgICBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZQotICAgICAgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvcgotICAgICAgb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkKLSAgICAgIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuCi0gICAgICBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYQotICAgICAgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkCi0gICAgICBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLSAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4KLQotICAgICAgVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdQotICAgICAgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91Ci0gICAgICByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIKLSAgICAgIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0bwotICAgICAgZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgIDMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLQotICAgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucwotICAgICAgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4KLSAgICAgIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IKLSAgICAgIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yCi0gICAgICBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nCi0gICAgICBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgotCi0gICAgICAzLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi0KLSAgICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQKLSAgICAgIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZQotICAgICAgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50c8OVCi0gICAgICByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhCi0gICAgICBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eQotICAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLgotICAgICAgSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbgotICAgICAgYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdQotICAgICAgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwKLSAgICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5Ci0gICAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbAotICAgICAgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZAotICAgICAgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YKLSAgICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLSAgICAKLQotICAgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLQotICAgICAgWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQKLSAgICAgIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zCi0gICAgICBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zCi0gICAgICBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbgotICAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlCi0gICAgICBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQKLSAgICAgIG9yIGFsdGVyIHRoZSByZWNpcGllbnTDlXMgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtCi0gICAgICBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91Ci0gICAgICBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhCi0gICAgICBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQKLSAgICAgIGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91Ci0gICAgICBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91Ci0gICAgICBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkKLSAgICAgIENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsCi0gICAgICBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcwotICAgICAgWW91IG9mZmVyLgotCi0gICAgICAzLjYuIExhcmdlciBXb3Jrcy4KLQotICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZQotICAgICAgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaAotICAgICAgYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UKLSAgICAgIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiAKLSAgICAgIAotNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuIAotCi0gICAgICA0LjEuIE5ldyBWZXJzaW9ucy4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kCi0gICAgICBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQotICAgICAgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbgotICAgICAgU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZQotICAgICAgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4gCi0KLSAgICAgIDQuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLQotICAgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZQotICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZAotICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhCi0gICAgICBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcKLSAgICAgIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkKLSAgICAgIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQKLSAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQKLSAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8KLSAgICAgIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZQotICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZQotICAgICAgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gCi0KLSAgICAgIDQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuCi0KLSAgICAgIFdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEKLSAgICAgIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQKLSAgICAgIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEpIHJlbmFtZQotICAgICAgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUKLSAgICAgIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzCi0gICAgICBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdAotICAgICAgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgotICAgICAgCi0KLTUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLUNPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIKLUJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsCi1JTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVECi1TT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQKLVBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZCi1DT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFCi1JTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRgotQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YKLVdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GCi1BTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUwotRElTQ0xBSU1FUi4gCi0KLTYuIFRFUk1JTkFUSU9OLiAKLQotICAgICAgNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbAotICAgICAgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMKLSAgICAgIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mCi0gICAgICBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcgotICAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZgotICAgICAgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi0KLSAgICAgIDYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZwotICAgICAgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvcgotICAgICAgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3QKLSAgICAgIHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzIHJlZmVycmVkIHRvIGFzICJQYXJ0aWNpcGFudCIpCi0gICAgICBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUKLSAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3IKLSAgICAgIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlCi0gICAgICBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55Ci0gICAgICBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IKLSAgICAgIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsCi0gICAgICBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KQotICAgICAgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcwotICAgICAgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50Ci0gICAgICB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbgotICAgICAgb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheQotICAgICAgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICAgIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIKLSAgICAgIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGgKLSAgICAgIFBhcnRpY2lwYW50LgotCi0gICAgICA2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yCi0gICAgICBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZAotICAgICAgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24KLSAgICAgIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKQotICAgICAgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLQotNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0KLVVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRQotSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GCi1DT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUKLUxJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQKLUxJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSwotU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSCi1DT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOCi1JTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YKLUxJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTAotSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFnDlVMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UCi1BUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8KLU5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UCi1BUFBMWSBUTyBZT1UuCi0KLTguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLVRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcwotZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwKLWNvbXB1dGVyIHNvZnR3YXJlIiAoYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgYXQgNDggQy5GLlIuIMKkCi0yNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZQotZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LgotMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMQotdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycwotYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4KLVRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsCi1hbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzCi1Hb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTkuIE1JU0NFTExBTkVPVVMuCi0KLVRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0Ci1tYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCi11bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUKLWdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UKLWNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudAotYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gKLWp1cmlzZGljdGlvbsOVcyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24KLXJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YKLXRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYQotbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcKLXBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0Ci1jb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXPDlSBmZWVzIGFuZCBleHBlbnNlcy4gVGhlCi1hcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZQotSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvcgotcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsCi1iZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLgotWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZQotVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0Ci1jb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLAotZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCi0KLTEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLgotCi1BcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzCi1yZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yCi1pbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UKLWFuZCBZb3UgYWdyZWUgdG8gd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8KLWRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcKLWhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uCi1vZiBsaWFiaWxpdHkuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gSkFYV1MgTGljZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjAKLQotMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQKLSAgICAgIGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgIDEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUKLSAgICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYQotICAgICAgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgIHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi0KLSAgICAgIDEuMy4gIkNvdmVyZWQgU29mdHdhcmUiIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yCi0gICAgICAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcwotICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcKLSAgICAgIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotICAgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0KLSAgICAgIG90aGVyIHRoYW4gU291cmNlIENvZGUuIAotCi0gICAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5Ci0gICAgICB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzCi0gICAgICBMaWNlbnNlLiAKLSAgICAgIAotICAgICAgMS42LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkCi0gICAgICBTb2Z0d2FyZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlCi0gICAgICB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICAgIDEuNy4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgIDEuOC4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZQotICAgICAgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwKLSAgICAgIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cwotICAgICAgY29udmV5ZWQgaGVyZWluLgotICAgICAgCi0gICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUKLSAgICAgIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6IAotCi0gICAgICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywKLSAgICAgICAgICAgIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhCi0gICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMKLSAgICAgICAgICAgIE1vZGlmaWNhdGlvbnM7IAotCi0gICAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUKLSAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IgCi0KLSAgICAgICAgICAgIEMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlCi0gICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgICAgMS4xMC4gIk9yaWdpbmFsIFNvZnR3YXJlIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kCi0gICAgICBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzCi0gICAgICBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4gCi0KLSAgICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQKLSAgICAgIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwKLSAgICAgIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQKLSAgICAgIExpY2Vuc2FibGUgYnkgZ3JhbnRvci4gCi0KLSAgICAgIDEuMTIuICJTb3VyY2UgQ29kZSIgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlcgotICAgICAgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikKLSAgICAgIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KLQotICAgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsCi0gICAgICBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YKLSAgICAgIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiCi0gICAgICBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcwotICAgICAgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzCi0gICAgICBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yCi0gICAgICBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKLSAgICAgIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAKLSAgICAgIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMKLSAgICAgIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0yLiBMaWNlbnNlIEdyYW50cy4gCi0KLSAgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgotCi0gICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZAotICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUKLSAgICAgIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKLSAgICAgIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOiAKLQotICAgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4KLSAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsCi0gICAgICAgICAgICB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLAotICAgICAgICAgICAgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yCi0gICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsCi0gICAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgCi0KLSAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLAotICAgICAgICAgICAgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZQotICAgICAgICAgICAgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3IKLSAgICAgICAgICAgIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IKLSAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLiAKLQotICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpCi0gICAgICAgICAgICBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0Ci0gICAgICAgICAgICBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlCi0gICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcwotICAgICAgICAgICAgTGljZW5zZS4gCi0KLSAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudAotICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20KLSAgICAgICAgICAgIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvciBpbmZyaW5nZW1lbnRzCi0gICAgICAgICAgICBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICAgICAgICAgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICAgICAgICAgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLiAKLQotICAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KLQotICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQKLSAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaAotICAgICAgQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsCi0gICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0KLSAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuCi0gICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvCi0gICAgICAgICAgICB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlCi0gICAgICAgICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2gKLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuCi0gICAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzCi0gICAgICAgICAgICBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLAotICAgICAgICAgICAgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aAotICAgICAgICAgICAgaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2gKLSAgICAgICAgICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwKLSAgICAgICAgICAgIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSkKLSAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucwotICAgICAgICAgICAgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMKLSAgICAgICAgICAgIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uCi0gICAgICAgICAgICAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuIAotCi0gICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZAotICAgICAgICAgICAgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QKLSAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuIAotCi0gICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQKLSAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yCi0gICAgICAgICAgICBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAoMikgZm9yCi0gICAgICAgICAgICBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkIHBhcnR5Ci0gICAgICAgICAgICBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlCi0gICAgICAgICAgICBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvcgotICAgICAgICAgICAgd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlCi0gICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMykgdW5kZXIKLSAgICAgICAgICAgIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlCi0gICAgICAgICAgICBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLiAKLQotMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotCi0gICAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLQotICAgICAgQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZQotICAgICAgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4KLSAgICAgIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlCi0gICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0Ci0gICAgICBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZQotICAgICAgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvcgotICAgICAgb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkKLSAgICAgIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuCi0gICAgICBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYQotICAgICAgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkCi0gICAgICBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLSAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4KLQotICAgICAgVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdQotICAgICAgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91Ci0gICAgICByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIKLSAgICAgIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0bwotICAgICAgZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgIDMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLQotICAgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucwotICAgICAgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4KLSAgICAgIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IKLSAgICAgIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yCi0gICAgICBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nCi0gICAgICBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgotCi0gICAgICAzLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi0KLSAgICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQKLSAgICAgIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZQotICAgICAgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50c8OVCi0gICAgICByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhCi0gICAgICBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eQotICAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLgotICAgICAgSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbgotICAgICAgYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdQotICAgICAgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwKLSAgICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5Ci0gICAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbAotICAgICAgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZAotICAgICAgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YKLSAgICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLSAgICAKLQotICAgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLQotICAgICAgWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQKLSAgICAgIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zCi0gICAgICBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zCi0gICAgICBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbgotICAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlCi0gICAgICBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQKLSAgICAgIG9yIGFsdGVyIHRoZSByZWNpcGllbnTDlXMgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtCi0gICAgICBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91Ci0gICAgICBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhCi0gICAgICBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQKLSAgICAgIGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91Ci0gICAgICBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91Ci0gICAgICBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkKLSAgICAgIENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsCi0gICAgICBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcwotICAgICAgWW91IG9mZmVyLgotCi0gICAgICAzLjYuIExhcmdlciBXb3Jrcy4KLQotICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZQotICAgICAgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaAotICAgICAgYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UKLSAgICAgIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiAKLSAgICAgIAotNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuIAotCi0gICAgICA0LjEuIE5ldyBWZXJzaW9ucy4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kCi0gICAgICBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQotICAgICAgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbgotICAgICAgU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZQotICAgICAgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4gCi0KLSAgICAgIDQuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLQotICAgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZQotICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZAotICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhCi0gICAgICBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcKLSAgICAgIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkKLSAgICAgIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQKLSAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQKLSAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8KLSAgICAgIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZQotICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZQotICAgICAgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gCi0KLSAgICAgIDQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuCi0KLSAgICAgIFdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEKLSAgICAgIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQKLSAgICAgIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEpIHJlbmFtZQotICAgICAgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUKLSAgICAgIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzCi0gICAgICBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdAotICAgICAgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgotICAgICAgCi0KLTUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLUNPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIKLUJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsCi1JTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVECi1TT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQKLVBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZCi1DT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFCi1JTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRgotQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YKLVdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GCi1BTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUwotRElTQ0xBSU1FUi4gCi0KLTYuIFRFUk1JTkFUSU9OLiAKLQotICAgICAgNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbAotICAgICAgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMKLSAgICAgIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mCi0gICAgICBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcgotICAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZgotICAgICAgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi0KLSAgICAgIDYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZwotICAgICAgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvcgotICAgICAgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3QKLSAgICAgIHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzIHJlZmVycmVkIHRvIGFzICJQYXJ0aWNpcGFudCIpCi0gICAgICBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUKLSAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3IKLSAgICAgIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlCi0gICAgICBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55Ci0gICAgICBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IKLSAgICAgIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsCi0gICAgICBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KQotICAgICAgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcwotICAgICAgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50Ci0gICAgICB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbgotICAgICAgb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheQotICAgICAgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICAgIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIKLSAgICAgIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGgKLSAgICAgIFBhcnRpY2lwYW50LgotCi0gICAgICA2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yCi0gICAgICBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZAotICAgICAgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24KLSAgICAgIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKQotICAgICAgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLQotNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0KLVVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRQotSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GCi1DT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUKLUxJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQKLUxJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSwotU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSCi1DT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOCi1JTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YKLUxJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTAotSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFnDlVMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UCi1BUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8KLU5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UCi1BUFBMWSBUTyBZT1UuCi0KLTguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLVRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcwotZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwKLWNvbXB1dGVyIHNvZnR3YXJlIiAoYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgYXQgNDggQy5GLlIuIMKkCi0yNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZQotZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LgotMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMQotdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycwotYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4KLVRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsCi1hbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzCi1Hb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTkuIE1JU0NFTExBTkVPVVMuCi0KLVRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0Ci1tYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCi11bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUKLWdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UKLWNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudAotYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gKLWp1cmlzZGljdGlvbsOVcyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24KLXJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YKLXRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYQotbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcKLXBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0Ci1jb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXPDlSBmZWVzIGFuZCBleHBlbnNlcy4gVGhlCi1hcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZQotSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvcgotcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsCi1iZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLgotWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZQotVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0Ci1jb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLAotZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCi0KLTEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLgotCi1BcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzCi1yZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yCi1pbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UKLWFuZCBZb3UgYWdyZWUgdG8gd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8KLWRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcKLWhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uCi1vZiBsaWFiaWxpdHkuCi0KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSBKYXhlbiBMaWNlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qCi0gJElkOiBMSUNFTlNFLnR4dCx2IDEuNSAyMDA2LzAyLzA1IDIxOjQ5OjA0IGVsaGFybyBFeHAgJAotCi0gQ29weXJpZ2h0IDIwMDMtMjAwNiBUaGUgV2Vya2VuIENvbXBhbnkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIG1ldDoKLQotICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEpheGVuIFByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgCi0gICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUwotSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECi1UTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKLVBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUgotT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLVBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSBKRG9tIExpY2Vuc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qLS0gCi0KLSAkSWQ6IExJQ0VOU0UudHh0LHYgMS4xMSAyMDA0LzAyLzA2IDA5OjMyOjU3IGpodW50ZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4gCi0KLSAqLwotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSBNU1YgTGljZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNvcHlyaWdodCAoYykgMjAwMS0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSBtZXQ6Ci0KLSAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gLSBSZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjdCB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gb3IgdGhlIG5hbWVzIG9mCi0gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMsIiB3aXRob3V0IGEgd2FycmFudHkgb2YgYW55IGtpbmQuIEFMTAotIEVYUFJFU1MgT1IgSU1QTElFRCBDT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsCi0gSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQotIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgSEVSRUJZIEVYQ0xVREVELiBTVU4gQU5ECi0gSVRTIExJQ0VOU09SUyBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgREFNQUdFUyBPUiBMSUFCSUxJVElFUwotIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIE9SIFJFTEFUSU5HIFRPIFVTRSwgTU9ESUZJQ0FUSU9OCi0gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBTT0ZUV0FSRSBPUiBJVFMgREVSSVZBVElWRVMuIElOIE5PIEVWRU5UIFdJTEwKLSBTVU4gT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIEFOWSBMT1NUIFJFVkVOVUUsIFBST0ZJVCBPUiBEQVRBLAotIE9SIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SCi0gUFVOSVRJVkUgREFNQUdFUywgSE9XRVZFUiBDQVVTRUQgQU5EIFJFR0FSRExFU1MgT0YgVEhFIFRIRU9SWSBPRgotIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFNPRlRXQVJFLAotIEVWRU4gSUYgU1VOIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotIFlvdSBhY2tub3dsZWRnZSB0aGF0IFNvZnR3YXJlIGlzIG5vdCBkZXNpZ25lZCxsaWNlbnNlZCBvciBpbnRlbmRlZCBmb3IKLSB1c2UgaW4gdGhlIGRlc2lnbiwgY29uc3RydWN0aW9uLCBvcGVyYXRpb24gb3IgbWFpbnRlbmFuY2Ugb2YgYW55Ci0gbnVjbGVhciBmYWNpbGl0eS4gICAKLSAgICAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBTYXhvbiBMaWNlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9aSUxMQSBQVUJMSUMgTElDRU5TRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCi0KLTEuIERlZmluaXRpb25zLgotCi0gICAgIDEuMS4gYGBDb250cmlidXRvcicnIG1lYW5zIGVhY2ggZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0bwotICAgICB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLQotICAgICAxLjIuIGBgQ29udHJpYnV0b3IgVmVyc2lvbicnIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgQ29kZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IsIGFuZCB0aGUgTW9kaWZpY2F0aW9ucwotICAgICBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLQotICAgICAxLjMuIGBgQ292ZXJlZCBDb2RlJycgbWVhbnMgdGhlIE9yaWdpbmFsIENvZGUgb3IgTW9kaWZpY2F0aW9ucyBvciB0aGUKLSAgICAgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgYW5kIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZQotICAgICBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotICAgICAxLjQuIGBgRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtJycgbWVhbnMgYSBtZWNoYW5pc20gZ2VuZXJhbGx5Ci0gICAgIGFjY2VwdGVkIGluIHRoZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgZm9yIHRoZSBlbGVjdHJvbmljCi0gICAgIHRyYW5zZmVyIG9mIGRhdGEuCi0KLSAgICAgMS41LiBgYEV4ZWN1dGFibGUnJyBtZWFucyBDb3ZlcmVkIENvZGUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UKLSAgICAgQ29kZS4KLQotICAgICAxLjYuIGBgSW5pdGlhbCBEZXZlbG9wZXInJyBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgaWRlbnRpZmllZCBhcwotICAgICB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0IEEuCi0KLSAgICAgMS43LiBgYExhcmdlciBXb3JrJycgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgQ29kZSBvcgotICAgICBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgICAxLjguIGBgTGljZW5zZScnIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgMS45LiBgYE1vZGlmaWNhdGlvbnMnJyBtZWFucyBhbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUKLSAgICAgc3Vic3RhbmNlIG9yIHN0cnVjdHVyZSBvZiBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW55IHByZXZpb3VzCi0gICAgIE1vZGlmaWNhdGlvbnMuIFdoZW4gQ292ZXJlZCBDb2RlIGlzIHJlbGVhc2VkIGFzIGEgc2VyaWVzIG9mIGZpbGVzLCBhCi0gICAgIE1vZGlmaWNhdGlvbiBpczoKLQotICAgICAgICAgIEEuIEFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBjb250ZW50cyBvZiBhIGZpbGUKLSAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIENvZGUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4KLQotICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yCi0gICAgICAgICAgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4KLQotICAgICAxLjEwLiBgYE9yaWdpbmFsIENvZGUnJyBtZWFucyBTb3VyY2UgQ29kZSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlCi0gICAgIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgU291cmNlIENvZGUgbm90aWNlIHJlcXVpcmVkIGJ5IEV4aGliaXQgQSBhcwotICAgICBPcmlnaW5hbCBDb2RlLCBhbmQgd2hpY2gsIGF0IHRoZSB0aW1lIG9mIGl0cyByZWxlYXNlIHVuZGVyIHRoaXMgTGljZW5zZQotICAgICBpcyBub3QgYWxyZWFkeSBDb3ZlcmVkIENvZGUgZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgIDEuMTEuIGBgU291cmNlIENvZGUnJyBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIENvdmVyZWQgQ29kZSBmb3IKLSAgICAgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQsIGluY2x1ZGluZyBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLSAgICAgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKLSAgICAgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiBhbiBFeGVjdXRhYmxlLCBvciBhIGxpc3Qgb2Ygc291cmNlIGNvZGUKLSAgICAgZGlmZmVyZW50aWFsIGNvbXBhcmlzb25zIGFnYWluc3QgZWl0aGVyIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGFub3RoZXIKLSAgICAgd2VsbCBrbm93biwgYXZhaWxhYmxlIENvdmVyZWQgQ29kZSBvZiB0aGUgQ29udHJpYnV0b3IncyBjaG9pY2UuIFRoZQotICAgICBTb3VyY2UgQ29kZSBjYW4gYmUgaW4gYSBjb21wcmVzc2VkIG9yIGFyY2hpdmFsIGZvcm0sIHByb3ZpZGVkIHRoZQotICAgICBhcHByb3ByaWF0ZSBkZWNvbXByZXNzaW9uIG9yIGRlLWFyY2hpdmluZyBzb2Z0d2FyZSBpcyB3aWRlbHkgYXZhaWxhYmxlCi0gICAgIGZvciBubyBjaGFyZ2UuCi0KLSAgICAgMS4xMi4gYGBZb3UnJyBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzCi0gICAgIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlIG9yIGEgZnV0dXJlCi0gICAgIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlzc3VlZCB1bmRlciBTZWN0aW9uIDYuMS4gRm9yIGxlZ2FsIGVudGl0aWVzLAotICAgICBgYFlvdScnIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzCi0gICAgIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICBgYGNvbnRyb2wnJyBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLTIuIFNvdXJjZSBDb2RlIExpY2Vuc2UuCi0KLSAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi0gICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKLSAgICAgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eQotICAgICBjbGFpbXM6Ci0KLSAgICAgICAgICAoYSkgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQKLSAgICAgICAgICBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKSB3aXRoIG9yIHdpdGhvdXQKLSAgICAgICAgICBNb2RpZmljYXRpb25zLCBvciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotCi0gICAgICAgICAgKGIpIHVuZGVyIHBhdGVudHMgbm93IG9yIGhlcmVhZnRlciBvd25lZCBvciBjb250cm9sbGVkIGJ5IEluaXRpYWwKLSAgICAgICAgICBEZXZlbG9wZXIsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlIGFuZCBzZWxsIChgYFV0aWxpemUnJykgdGhlCi0gICAgICAgICAgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGJ1dCBzb2xlbHkgdG8gdGhlIGV4dGVudCB0aGF0Ci0gICAgICAgICAgYW55IHN1Y2ggcGF0ZW50IGlzIHJlYXNvbmFibHkgbmVjZXNzYXJ5IHRvIGVuYWJsZSBZb3UgdG8gVXRpbGl6ZQotICAgICAgICAgIHRoZSBPcmlnaW5hbCBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKSBhbmQgbm90IHRvIGFueSBncmVhdGVyCi0gICAgICAgICAgZXh0ZW50IHRoYXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBVdGlsaXplIGZ1cnRoZXIgTW9kaWZpY2F0aW9ucyBvcgotICAgICAgICAgIGNvbWJpbmF0aW9ucy4KLQotICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotICAgICBFYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLAotICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci0gICAgIGNsYWltczoKLQotICAgICAgICAgIChhKSB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZAotICAgICAgICAgIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvcgotICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyCi0gICAgICAgICAgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBDb2RlIG9yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0KLSAgICAgICAgICAoYikgdW5kZXIgcGF0ZW50cyBub3cgb3IgaGVyZWFmdGVyIG93bmVkIG9yIGNvbnRyb2xsZWQgYnkKLSAgICAgICAgICBDb250cmlidXRvciwgdG8gVXRpbGl6ZSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMKLSAgICAgICAgICB0aGVyZW9mKSwgYnV0IHNvbGVseSB0byB0aGUgZXh0ZW50IHRoYXQgYW55IHN1Y2ggcGF0ZW50IGlzCi0gICAgICAgICAgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gZW5hYmxlIFlvdSB0byBVdGlsaXplIHRoZSBDb250cmlidXRvcgotICAgICAgICAgIFZlcnNpb24gKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBhbmQgbm90IHRvIGFueSBncmVhdGVyIGV4dGVudCB0aGF0Ci0gICAgICAgICAgbWF5IGJlIG5lY2Vzc2FyeSB0byBVdGlsaXplIGZ1cnRoZXIgTW9kaWZpY2F0aW9ucyBvciBjb21iaW5hdGlvbnMuCi0KLTMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KLQotICAgICAzLjEuIEFwcGxpY2F0aW9uIG9mIExpY2Vuc2UuCi0gICAgIFRoZSBNb2RpZmljYXRpb25zIHdoaWNoIFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlCi0gICAgIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAgICAgU2VjdGlvbiAyLjIuIFRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mIENvdmVyZWQgQ29kZSBtYXkgYmUgZGlzdHJpYnV0ZWQKLSAgICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhpcwotICAgICBMaWNlbnNlIHJlbGVhc2VkIHVuZGVyIFNlY3Rpb24gNi4xLCBhbmQgWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcwotICAgICBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgWW91IGRpc3RyaWJ1dGUuIFlvdSBtYXkgbm90Ci0gICAgIG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IFNvdXJjZSBDb2RlIHZlcnNpb24gdGhhdCBhbHRlcnMgb3IKLSAgICAgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJwotICAgICByaWdodHMgaGVyZXVuZGVyLiBIb3dldmVyLCBZb3UgbWF5IGluY2x1ZGUgYW4gYWRkaXRpb25hbCBkb2N1bWVudAotICAgICBvZmZlcmluZyB0aGUgYWRkaXRpb25hbCByaWdodHMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy41LgotCi0gICAgIDMuMi4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotICAgICBBbnkgTW9kaWZpY2F0aW9uIHdoaWNoIFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgbXVzdCBiZQotICAgICBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKLSAgICAgZWl0aGVyIG9uIHRoZSBzYW1lIG1lZGlhIGFzIGFuIEV4ZWN1dGFibGUgdmVyc2lvbiBvciB2aWEgYW4gYWNjZXB0ZWQKLSAgICAgRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIHRvIGFueW9uZSB0byB3aG9tIHlvdSBtYWRlIGFuCi0gICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBhdmFpbGFibGU7IGFuZCBpZiBtYWRlIGF2YWlsYWJsZSB2aWEgRWxlY3Ryb25pYwotICAgICBEaXN0cmlidXRpb24gTWVjaGFuaXNtLCBtdXN0IHJlbWFpbiBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IHR3ZWx2ZSAoMTIpCi0gICAgIG1vbnRocyBhZnRlciB0aGUgZGF0ZSBpdCBpbml0aWFsbHkgYmVjYW1lIGF2YWlsYWJsZSwgb3IgYXQgbGVhc3Qgc2l4Ci0gICAgICg2KSBtb250aHMgYWZ0ZXIgYSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhhdCBwYXJ0aWN1bGFyIE1vZGlmaWNhdGlvbgotICAgICBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSB0byBzdWNoIHJlY2lwaWVudHMuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yCi0gICAgIGVuc3VyaW5nIHRoYXQgdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gcmVtYWlucyBhdmFpbGFibGUgZXZlbiBpZiB0aGUKLSAgICAgRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIGlzIG1haW50YWluZWQgYnkgYSB0aGlyZCBwYXJ0eS4KLQotICAgICAzLjMuIERlc2NyaXB0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0gICAgIFlvdSBtdXN0IGNhdXNlIGFsbCBDb3ZlcmVkIENvZGUgdG8gd2hpY2ggeW91IGNvbnRyaWJ1dGUgdG8gY29udGFpbiBhCi0gICAgIGZpbGUgZG9jdW1lbnRpbmcgdGhlIGNoYW5nZXMgWW91IG1hZGUgdG8gY3JlYXRlIHRoYXQgQ292ZXJlZCBDb2RlIGFuZAotICAgICB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBZb3UgbXVzdCBpbmNsdWRlIGEgcHJvbWluZW50IHN0YXRlbWVudCB0aGF0IHRoZQotICAgICBNb2RpZmljYXRpb24gaXMgZGVyaXZlZCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgZnJvbSBPcmlnaW5hbCBDb2RlCi0gICAgIHByb3ZpZGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBJbml0aWFsCi0gICAgIERldmVsb3BlciBpbiAoYSkgdGhlIFNvdXJjZSBDb2RlLCBhbmQgKGIpIGluIGFueSBub3RpY2UgaW4gYW4KLSAgICAgRXhlY3V0YWJsZSB2ZXJzaW9uIG9yIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBpbiB3aGljaCBZb3UgZGVzY3JpYmUgdGhlCi0gICAgIG9yaWdpbiBvciBvd25lcnNoaXAgb2YgdGhlIENvdmVyZWQgQ29kZS4KLQotICAgICAzLjQuIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBNYXR0ZXJzCi0KLSAgICAgICAgICAoYSkgVGhpcmQgUGFydHkgQ2xhaW1zLgotICAgICAgICAgIElmIFlvdSBoYXZlIGtub3dsZWRnZSB0aGF0IGEgcGFydHkgY2xhaW1zIGFuIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotICAgICAgICAgIHJpZ2h0IGluIHBhcnRpY3VsYXIgZnVuY3Rpb25hbGl0eSBvciBjb2RlIChvciBpdHMgdXRpbGl6YXRpb24KLSAgICAgICAgICB1bmRlciB0aGlzIExpY2Vuc2UpLCB5b3UgbXVzdCBpbmNsdWRlIGEgdGV4dCBmaWxlIHdpdGggdGhlIHNvdXJjZQotICAgICAgICAgIGNvZGUgZGlzdHJpYnV0aW9uIHRpdGxlZCBgYExFR0FMJycgd2hpY2ggZGVzY3JpYmVzIHRoZSBjbGFpbSBhbmQKLSAgICAgICAgICB0aGUgcGFydHkgbWFraW5nIHRoZSBjbGFpbSBpbiBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGEgcmVjaXBpZW50Ci0gICAgICAgICAgd2lsbCBrbm93IHdob20gdG8gY29udGFjdC4gSWYgeW91IG9idGFpbiBzdWNoIGtub3dsZWRnZSBhZnRlciBZb3UKLSAgICAgICAgICBtYWtlIFlvdXIgTW9kaWZpY2F0aW9uIGF2YWlsYWJsZSBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjIsIFlvdQotICAgICAgICAgIHNoYWxsIHByb21wdGx5IG1vZGlmeSB0aGUgTEVHQUwgZmlsZSBpbiBhbGwgY29waWVzIFlvdSBtYWtlCi0gICAgICAgICAgYXZhaWxhYmxlIHRoZXJlYWZ0ZXIgYW5kIHNoYWxsIHRha2Ugb3RoZXIgc3RlcHMgKHN1Y2ggYXMgbm90aWZ5aW5nCi0gICAgICAgICAgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0cyBvciBuZXdzZ3JvdXBzKSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8KLSAgICAgICAgICBpbmZvcm0gdGhvc2Ugd2hvIHJlY2VpdmVkIHRoZSBDb3ZlcmVkIENvZGUgdGhhdCBuZXcga25vd2xlZGdlIGhhcwotICAgICAgICAgIGJlZW4gb2J0YWluZWQuCi0KLSAgICAgICAgICAoYikgQ29udHJpYnV0b3IgQVBJcy4KLSAgICAgICAgICBJZiBZb3VyIE1vZGlmaWNhdGlvbiBpcyBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UgYW5kCi0gICAgICAgICAgWW91IG93biBvciBjb250cm9sIHBhdGVudHMgd2hpY2ggYXJlIHJlYXNvbmFibHkgbmVjZXNzYXJ5IHRvCi0gICAgICAgICAgaW1wbGVtZW50IHRoYXQgQVBJLCB5b3UgbXVzdCBhbHNvIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgICAgICBMRUdBTCBmaWxlLgotCi0gICAgIDMuNS4gUmVxdWlyZWQgTm90aWNlcy4KLSAgICAgWW91IG11c3QgZHVwbGljYXRlIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGluIGVhY2ggZmlsZSBvZiB0aGUgU291cmNlCi0gICAgIENvZGUsIGFuZCB0aGlzIExpY2Vuc2UgaW4gYW55IGRvY3VtZW50YXRpb24gZm9yIHRoZSBTb3VyY2UgQ29kZSwgd2hlcmUKLSAgICAgWW91IGRlc2NyaWJlIHJlY2lwaWVudHMnIHJpZ2h0cyByZWxhdGluZyB0byBDb3ZlcmVkIENvZGUuIElmIFlvdQotICAgICBjcmVhdGVkIG9uZSBvciBtb3JlIE1vZGlmaWNhdGlvbihzKSwgWW91IG1heSBhZGQgeW91ciBuYW1lIGFzIGEKLSAgICAgQ29udHJpYnV0b3IgdG8gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBLiBJZiBpdCBpcyBub3QgcG9zc2libGUKLSAgICAgdG8gcHV0IHN1Y2ggbm90aWNlIGluIGEgcGFydGljdWxhciBTb3VyY2UgQ29kZSBmaWxlIGR1ZSB0byBpdHMKLSAgICAgc3RydWN0dXJlLCB0aGVuIHlvdSBtdXN0IGluY2x1ZGUgc3VjaCBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhCi0gICAgIHJlbGV2YW50IGRpcmVjdG9yeSBmaWxlKSB3aGVyZSBhIHVzZXIgd291bGQgYmUgbGlrZWx5IHRvIGxvb2sgZm9yIHN1Y2gKLSAgICAgYSBub3RpY2UuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksCi0gICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cwotICAgICBvZiBDb3ZlcmVkIENvZGUuIEhvd2V2ZXIsIFlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZAotICAgICBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0Ci0gICAgIG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGFuIGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IKLSAgICAgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvCi0gICAgIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgIGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mCi0gICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLQotICAgICAzLjYuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgQ292ZXJlZCBDb2RlIGluIEV4ZWN1dGFibGUgZm9ybSBvbmx5IGlmIHRoZQotICAgICByZXF1aXJlbWVudHMgb2YgU2VjdGlvbiAzLjEtMy41IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLAotICAgICBhbmQgaWYgWW91IGluY2x1ZGUgYSBub3RpY2Ugc3RhdGluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mIHRoZQotICAgICBDb3ZlcmVkIENvZGUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGluY2x1ZGluZyBhCi0gICAgIGRlc2NyaXB0aW9uIG9mIGhvdyBhbmQgd2hlcmUgWW91IGhhdmUgZnVsZmlsbGVkIHRoZSBvYmxpZ2F0aW9ucyBvZgotICAgICBTZWN0aW9uIDMuMi4gVGhlIG5vdGljZSBtdXN0IGJlIGNvbnNwaWN1b3VzbHkgaW5jbHVkZWQgaW4gYW55IG5vdGljZSBpbgotICAgICBhbiBFeGVjdXRhYmxlIHZlcnNpb24sIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBvciBjb2xsYXRlcmFsIGluIHdoaWNoIFlvdQotICAgICBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gdGhlIENvdmVyZWQgQ29kZS4gWW91IG1heQotICAgICBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gb2YgQ292ZXJlZCBDb2RlIHVuZGVyIGEgbGljZW5zZSBvZgotICAgICBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLAotICAgICBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kCi0gICAgIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdAotICAgICBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIGZyb20gdGhlCi0gICAgIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZQotICAgICB2ZXJzaW9uIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyCi0gICAgIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsCi0gICAgIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvCi0gICAgIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgIGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mCi0gICAgIGFueSBzdWNoIHRlcm1zIFlvdSBvZmZlci4KLQotICAgICAzLjcuIExhcmdlciBXb3Jrcy4KLSAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBDb2RlIHdpdGggb3RoZXIgY29kZQotICAgICBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyCi0gICAgIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUKLSAgICAgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBDb2RlLgotCi00LiBJbmFiaWxpdHkgdG8gQ29tcGx5IER1ZSB0byBTdGF0dXRlIG9yIFJlZ3VsYXRpb24uCi0KLSAgICAgSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgWW91IHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgdGVybXMgb2YgdGhpcwotICAgICBMaWNlbnNlIHdpdGggcmVzcGVjdCB0byBzb21lIG9yIGFsbCBvZiB0aGUgQ292ZXJlZCBDb2RlIGR1ZSB0byBzdGF0dXRlCi0gICAgIG9yIHJlZ3VsYXRpb24gdGhlbiBZb3UgbXVzdDogKGEpIGNvbXBseSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKLSAgICAgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlOyBhbmQgKGIpIGRlc2NyaWJlIHRoZSBsaW1pdGF0aW9ucyBhbmQKLSAgICAgdGhlIGNvZGUgdGhleSBhZmZlY3QuIFN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgTEVHQUwKLSAgICAgZmlsZSBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjQgYW5kIG11c3QgYmUgaW5jbHVkZWQgd2l0aCBhbGwKLSAgICAgZGlzdHJpYnV0aW9ucyBvZiB0aGUgU291cmNlIENvZGUuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHByb2hpYml0ZWQgYnkKLSAgICAgc3RhdHV0ZSBvciByZWd1bGF0aW9uLCBzdWNoIGRlc2NyaXB0aW9uIG11c3QgYmUgc3VmZmljaWVudGx5IGRldGFpbGVkCi0gICAgIGZvciBhIHJlY2lwaWVudCBvZiBvcmRpbmFyeSBza2lsbCB0byBiZSBhYmxlIHRvIHVuZGVyc3RhbmQgaXQuCi0KLTUuIEFwcGxpY2F0aW9uIG9mIHRoaXMgTGljZW5zZS4KLQotICAgICBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBjb2RlIHRvIHdoaWNoIHRoZSBJbml0aWFsIERldmVsb3BlciBoYXMKLSAgICAgYXR0YWNoZWQgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEsIGFuZCB0byByZWxhdGVkIENvdmVyZWQgQ29kZS4KLQotNi4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCi0KLSAgICAgNi4xLiBOZXcgVmVyc2lvbnMuCi0gICAgIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uIChgYE5ldHNjYXBlJycpIG1heSBwdWJsaXNoIHJldmlzZWQKLSAgICAgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGUgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwKLSAgICAgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4KLQotICAgICA2LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0gICAgIE9uY2UgQ292ZXJlZCBDb2RlIGhhcyBiZWVuIHB1Ymxpc2hlZCB1bmRlciBhIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUKLSAgICAgTGljZW5zZSwgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGF0Ci0gICAgIHZlcnNpb24uIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8gdXNlIHN1Y2ggQ292ZXJlZCBDb2RlIHVuZGVyIHRoZSB0ZXJtcwotICAgICBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSBOZXRzY2FwZS4gTm8gb25lCi0gICAgIG90aGVyIHRoYW4gTmV0c2NhcGUgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhlIHRlcm1zIGFwcGxpY2FibGUgdG8KLSAgICAgQ292ZXJlZCBDb2RlIGNyZWF0ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICAgIDYuMy4gRGVyaXZhdGl2ZSBXb3Jrcy4KLSAgICAgSWYgeW91IGNyZWF0ZSBvciB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSAod2hpY2ggeW91IG1heQotICAgICBvbmx5IGRvIGluIG9yZGVyIHRvIGFwcGx5IGl0IHRvIGNvZGUgd2hpY2ggaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlCi0gICAgIGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSksIHlvdSBtdXN0IChhKSByZW5hbWUgWW91ciBsaWNlbnNlIHNvIHRoYXQgdGhlCi0gICAgIHBocmFzZXMgYGBNb3ppbGxhJycsIGBgTU9aSUxMQVBMJycsIGBgTU9aUEwnJywgYGBOZXRzY2FwZScnLCBgYE5QTCcnIG9yCi0gICAgIGFueSBjb25mdXNpbmdseSBzaW1pbGFyIHBocmFzZSBkbyBub3QgYXBwZWFyIGFueXdoZXJlIGluIHlvdXIgbGljZW5zZQotICAgICBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgeW91ciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlCi0gICAgIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgICBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZS4gKEZpbGxpbmcgaW4gdGhlIG5hbWUgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLAotICAgICBPcmlnaW5hbCBDb2RlIG9yIENvbnRyaWJ1dG9yIGluIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQSBzaGFsbAotICAgICBub3Qgb2YgdGhlbXNlbHZlcyBiZSBkZWVtZWQgdG8gYmUgbW9kaWZpY2F0aW9ucyBvZiB0aGlzIExpY2Vuc2UuKQotCi03LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi0gICAgIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gYGBBUyBJUycnIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywKLSAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GCi0gICAgIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4KLSAgICAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBDT0RFCi0gICAgIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsCi0gICAgIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUKLSAgICAgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUgotICAgICBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRgotICAgICBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCi0KLTguIFRFUk1JTkFUSU9OLgotCi0gICAgIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZQotICAgICBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlCi0gICAgIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIEFsbAotICAgICBzdWJsaWNlbnNlcyB0byB0aGUgQ292ZXJlZCBDb2RlIHdoaWNoIGFyZSBwcm9wZXJseSBncmFudGVkIHNoYWxsCi0gICAgIHN1cnZpdmUgYW55IHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIKLSAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UKLSAgICAgc2hhbGwgc3Vydml2ZS4KLQotOS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0KLSAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQKLSAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgVEhFIElOSVRJQUwKLSAgICAgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIENPREUsCi0gICAgIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gWU9VIE9SIEFOWSBPVEhFUgotICAgICBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gICAgIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YKLSAgICAgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQKLSAgICAgQUxMIE9USEVSIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFCi0gICAgIEJFRU4gSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GCi0gICAgIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkKLSAgICAgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWSdTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVwotICAgICBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRQotICAgICBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhBVAotICAgICBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0KLTEwLiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotCi0gICAgIFRoZSBDb3ZlcmVkIENvZGUgaXMgYSBgYGNvbW1lcmNpYWwgaXRlbSwnJyBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbgotICAgICA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgYGBjb21tZXJjaWFsIGNvbXB1dGVyCi0gICAgIHNvZnR3YXJlJycgYW5kIGBgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uLCcnIGFzIHN1Y2gKLSAgICAgdGVybXMgYXJlIHVzZWQgaW4gNDggQy5GLlIuIDEyLjIxMiAoU2VwdC4gMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OAotICAgICBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksCi0gICAgIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBDb2RlIHdpdGggb25seSB0aG9zZQotICAgICByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4KLQotMTEuIE1JU0NFTExBTkVPVVMuCi0KLSAgICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QKLSAgICAgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQotICAgICB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQKLSAgICAgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieQotICAgICBDYWxpZm9ybmlhIGxhdyBwcm92aXNpb25zIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LAotICAgICBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgaXRzIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBXaXRoCi0gICAgIHJlc3BlY3QgdG8gZGlzcHV0ZXMgaW4gd2hpY2ggYXQgbGVhc3Qgb25lIHBhcnR5IGlzIGEgY2l0aXplbiBvZiwgb3IgYW4KLSAgICAgZW50aXR5IGNoYXJ0ZXJlZCBvciByZWdpc3RlcmVkIHRvIGRvIGJ1c2luZXNzIGluLCB0aGUgVW5pdGVkIFN0YXRlcyBvZgotICAgICBBbWVyaWNhOiAoYSkgdW5sZXNzIG90aGVyd2lzZSBhZ3JlZWQgaW4gd3JpdGluZywgYWxsIGRpc3B1dGVzIHJlbGF0aW5nCi0gICAgIHRvIHRoaXMgTGljZW5zZSAoZXhjZXB0aW5nIGFueSBkaXNwdXRlIHJlbGF0aW5nIHRvIGludGVsbGVjdHVhbAotICAgICBwcm9wZXJ0eSByaWdodHMpIHNoYWxsIGJlIHN1YmplY3QgdG8gZmluYWwgYW5kIGJpbmRpbmcgYXJiaXRyYXRpb24sCi0gICAgIHdpdGggdGhlIGxvc2luZyBwYXJ0eSBwYXlpbmcgYWxsIGNvc3RzIG9mIGFyYml0cmF0aW9uOyAoYikgYW55Ci0gICAgIGFyYml0cmF0aW9uIHJlbGF0aW5nIHRvIHRoaXMgQWdyZWVtZW50IHNoYWxsIGJlIGhlbGQgaW4gU2FudGEgQ2xhcmEKLSAgICAgQ291bnR5LCBDYWxpZm9ybmlhLCB1bmRlciB0aGUgYXVzcGljZXMgb2YgSkFNUy9FbmREaXNwdXRlOyBhbmQgKGMpIGFueQotICAgICBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgQWdyZWVtZW50IHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlCi0gICAgIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mCi0gICAgIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLCB3aXRoCi0gICAgIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLAotICAgICBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbgotICAgICBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsCi0gICAgIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2gKLSAgICAgcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUKLSAgICAgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLgotCi0xMi4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotICAgICBFeGNlcHQgaW4gY2FzZXMgd2hlcmUgYW5vdGhlciBDb250cmlidXRvciBoYXMgZmFpbGVkIHRvIGNvbXBseSB3aXRoCi0gICAgIFNlY3Rpb24gMy40LCBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yCi0gICAgIGluZGlyZWN0bHksIG91dCBvZiBZb3VyIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UsIGJhc2VkCi0gICAgIG9uIHRoZSBudW1iZXIgb2YgY29waWVzIG9mIENvdmVyZWQgQ29kZSB5b3UgbWFkZSBhdmFpbGFibGUsIHRoZQotICAgICByZXZlbnVlcyB5b3UgcmVjZWl2ZWQgZnJvbSB1dGlsaXppbmcgc3VjaCByaWdodHMsIGFuZCBvdGhlciByZWxldmFudAotICAgICBmYWN0b3JzLiBZb3UgYWdyZWUgdG8gd29yayB3aXRoIGFmZmVjdGVkIHBhcnRpZXMgdG8gZGlzdHJpYnV0ZQotICAgICByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuCi0KLUVYSElCSVQgQS4KLQotICAgICBgYFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKLSAgICAgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgotICAgICBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLQotICAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCi0gICAgIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gICAgIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucwotICAgICB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy4KLQotICAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgX19fX19fX19fX19fX19fX19fX19fX19fLgotICAgICBQb3J0aW9ucyBjcmVhdGVkIGJ5IF9fX19fX19fX19fX19fX19fX19fX18gYXJlIENvcHlyaWdodCAoQykgX19fX19fCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gICAgIENvbnRyaWJ1dG9yKHMpOiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy4nJwpkaWZmIC0tZ2l0IGEvc2VydmljZW1peC1idWlsZC9OT1RJQ0UgYi9zZXJ2aWNlbWl4LWJ1aWxkL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2ZmVjZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlbWl4LWJ1aWxkL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgPT0gIE5PVElDRSBmaWxlIGZvciB1c2Ugd2l0aCB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICA9PQ0KLSAgID09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgU2VydmljZU1peCBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgPT0NCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotICAgVGhpcyBwcm9kdWN0IGNvbnRhaW5zIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLSAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotDQotDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLT09ICBCb3VuY3kgQ2FzdGxlIE5vdGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlICh0aGUgQVNOMSBjb2RlYyBpbiB0aGUgb3JnLmFwYWNoZS5nZXJvbmltby5hc24xDQotcGFja2FnZSkgd2hpY2ggd2FzIGRldmVsb3BlZCBieSB0aGUgQm91bmN5IENhc3RsZSBwcm9qZWN0LiANCi0oaHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnLykgDQotDQotICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBUaGUgTGVnaW9uIE9mIFRoZSBCb3VuY3kgQ2FzdGxlIChodHRwOi8vd3d3LmJvdW5jeWNhc3RsZS5vcmcpDQotDQotDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLT09ICBEZXJieSBOb3RpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotUG9ydGlvbnMgb2YgRGVyYnkgd2VyZSBvcmdpbmFsbHkgZGV2ZWxvcGVkIGJ5DQotSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgYXJlDQotbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZQ0KLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIsDQotaW5mb3JtYWxseSBrbm93biBhcyB0aGUgIkRlcmJ5IENMQSIuDQotDQotVGhlIHBvcnRpb24gb2YgdGhlIGZ1bmN0aW9uVGVzdHMgdW5kZXIgJ25pc3QnIHdhcyBvcmlnaW5hbGx5IA0KLWRldmVsb3BlZCBieSB0aGUgTmF0aW9uYWwgSW5zdGl0dXRlIG9mIFN0YW5kYXJkcyBhbmQgVGVjaG5vbG9neSAoTklTVCksIA0KLWFuIGFnZW5jeSBvZiB0aGUgVW5pdGVkIFN0YXRlcyBEZXBhcnRtZW50IG9mIENvbW1lcmNlLCBhbmQgYWRhcHRlZCBieQ0KLUludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBOSVNUDQotU29mdHdhcmUgQWNrbm93bGVkZ21lbnQgYW5kIFJlZGlzdHJpYnV0aW9uIGRvY3VtZW50IGF0DQotaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk3L2N0Zy9zcWxfZm9ybS5odG0NCi0NCi0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotPT0gIFNwcmluZyBOb3RpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcpLg0KLQ0KLVRoaXMgcHJvZHVjdCBhbHNvIGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLUNsaW50b24gQmVnaW4gKGh0dHA6Ly93d3cuaWJhdGlzLmNvbSkuDQotDQotVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCBhIHJlZGlzdHJpYnV0aW9uLCBpZiBhbnksDQotbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50Og0KLQ0KLSAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgU3ByaW5nIEZyYW1ld29yaw0KLSAgUHJvamVjdCAoaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnKS4iDQotDQotQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwNCi1pZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4NCi0NCi1UaGUgbmFtZXMgIlNwcmluZyIgYW5kICJTcHJpbmcgRnJhbWV3b3JrIiBtdXN0IG5vdCBiZSB1c2VkIHRvDQotZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQNCi1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0DQotcm9kLmpvaG5zb25AaW50ZXJmYWNlMjEuY29tIG9yIGp1ZXJnZW4uaG9lbGxlckBpbnRlcmZhY2UyMS5jb20uDQotICAgDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLT09ICBNWDRKIE5vdGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTVg0SiBwcm9qZWN0IA0KLShodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL214NGopLg0KLQ0KLQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi09PSAgV1NETDRKIE5vdGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVRoZSBQcm9ncmFtIGluY2x1ZGVzIGFsbCBvciBwb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHNvZnR3YXJlIHdoaWNoIGlzIA0KLXN1YmplY3QgdG8gdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoIkNQTCBDb2RlIikuICBUaGlzIHNvZnR3YXJlIA0KLWNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YNCi10aGUgV1NETDRKIHByb2plY3QuDQotDQotWW91IG1heSBkb3dubG9hZCB0aGUgc291cmNlIHZlcnNpb24gb2YgdGhlIFdTREw0SiBjb21wb25lbnQgYXQgDQotaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93c2RsNGoNCi0NCi0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotPT0gIFhlcmNlcyBOb3RpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOg0KLSAgLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIElCTSBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cuaWJtLmNvbS4NCi0gIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBTdW4gTWljcm9zeXN0ZW1zLiwgaHR0cDovL3d3dy5zdW4uY29tLg0KLSAgLSB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IFBhdWwgRW5nIG9uIGJlaGFsZiBvZiB0aGUgDQotICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGRldmVsb3BlZCBhdCANCi0gICAgaUNsaWNrLCBJbmMuLCBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTkuDQotDQotDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLT09ICBYbWxCZWFucyBOb3RpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoNCi0gIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMsIEJFQSBTeXN0ZW1zLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uDQotDQotQXNpZGUgZnJvbSBjb250cmlidXRpb25zIHRvIHRoZSBBcGFjaGUgWE1MQmVhbnMgcHJvamVjdCwgdGhpcw0KLXNvZnR3YXJlIGFsc28gaW5jbHVkZXM6DQotDQotIC0gb25lIG9yIG1vcmUgc291cmNlIGZpbGVzIGZyb20gdGhlIEFwYWNoZSBYZXJjZXMtSiBhbmQgQXBhY2hlIEF4aXMNCi0gICBwcm9kdWN0cywgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gLSBXM0MgWE1MIFNjaGVtYSBkb2N1bWVudHMgQ29weXJpZ2h0IDIwMDEtMjAwMyAoYykgV29ybGQgV2lkZSBXZWINCi0gICBDb25zb3J0aXVtIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBFdXJvcGVhbiBSZXNlYXJjaA0KLSAgIENvbnNvcnRpdW0gZm9yIEluZm9ybWF0aWNzIGFuZCBNYXRoZW1hdGljcywgS2VpbyBVbml2ZXJzaXR5KQ0KLQ0KLSAtIHJlc29sdmVyLmphciBmcm9tIEFwYWNoZSBYbWwgQ29tbW9ucyBwcm9qZWN0LA0KLSAgIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotIC0gUGljY29sbyBYTUwgUGFyc2VyIGZvciBKYXZhIGZyb20gaHR0cDovL3BpY2NvbG8uc291cmNlZm9yZ2UubmV0LywNCi0gICBDb3B5cmlnaHQgMjAwMiBZdXZhbCBPcmVuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIA0KLSAgIExpY2Vuc2UgMi4wDQotDQotDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLT09ICBYbWxTZWN1cml0eSBOb3RpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotSXQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBJbnN0aXR1dGUgZm9yDQotRGF0YSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCA8aHR0cDovL3d3dy5udWUuZXQtaW5mLnVuaS1zaWVnZW4uZGUvPi4NCi0NCi1UaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzb2Z0d2FyZSB3YXMgcGFydGx5IGZ1bmRlZCBieSB0aGUgRXVyb3BlYW4gDQotQ29tbWlzc2lvbiBpbiB0aGUgPFdlYlNpZz4gcHJvamVjdCBpbiB0aGUgSVNJUyBQcm9ncmFtbWUuIA0KLQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi09PSAgT3BlblNhbWwgTm90aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVdlIHdpc2ggdG8gYWNrbm93bGVkZ2UgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRlZCB3b3JrcyB0aGF0IG1ha2UgdXANCi1wb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlOg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBTb2Z0d2FyZQ0KLUZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLVdlIGFsc28gdGhhbmsgVG9tIFNjYXZvIGZvciBkb25hdGluZyB0aGUgb3JpZ2luYWwgU0FNTCBhcnRpZmFjdA0KLWltcGxlbWVudGF0aW9uLg0KLQ0KLQ0KLSAgIFRoaXMgZm9sbG93aW5nIG5vdGljZXMgcmVmZXIgdG8gcG9ydGlvbnMgb2YgdGhpcw0KLSAgIHNvZnR3YXJlLg0KLQ0KLQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi09PSAgVzNDIE5vdGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVczQ8KuIERPQ1VNRU5UIExJQ0VOU0UNCi1odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LWRvY3VtZW50cy0yMDAyMTIzMQ0KLQ0KLVB1YmxpYyBkb2N1bWVudHMgb24gdGhlIFczQyBzaXRlIGFyZSBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlLiBCeSB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIGRvY3VtZW50LCBvciB0aGUgVzNDIGRvY3VtZW50IGZyb20gd2hpY2ggdGhpcyBzdGF0ZW1lbnQgaXMgbGlua2VkLCB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOg0KLQ0KLVBlcm1pc3Npb24gdG8gY29weSwgYW5kIGRpc3RyaWJ1dGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZG9jdW1lbnQsIG9yIHRoZSBXM0MgZG9jdW1lbnQgZnJvbSB3aGljaCB0aGlzIHN0YXRlbWVudCBpcyBsaW5rZWQsIGluIGFueSBtZWRpdW0gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcyBvZiB0aGUgZG9jdW1lbnQsIG9yIHBvcnRpb25zIHRoZXJlb2YsIHRoYXQgeW91IHVzZToNCi0NCi0gICAxLiBBIGxpbmsgb3IgVVJMIHRvIHRoZSBvcmlnaW5hbCBXM0MgZG9jdW1lbnQuDQotICAgMi4gVGhlIHByZS1leGlzdGluZyBjb3B5cmlnaHQgbm90aWNlIG9mIHRoZSBvcmlnaW5hbCBhdXRob3IsIG9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGEgbm90aWNlIChoeXBlcnRleHQgaXMgcHJlZmVycmVkLCBidXQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIGlzIHBlcm1pdHRlZCkgb2YgdGhlIGZvcm06ICJDb3B5cmlnaHQgwqkgWyRkYXRlLW9mLWRvY3VtZW50XSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgRXVyb3BlYW4gUmVzZWFyY2ggQ29uc29ydGl1bSBmb3IgSW5mb3JtYXRpY3MgYW5kIE1hdGhlbWF0aWNzLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LWRvY3VtZW50cy0yMDAyMTIzMSINCi0gICAzLiBJZiBpdCBleGlzdHMsIHRoZSBTVEFUVVMgb2YgdGhlIFczQyBkb2N1bWVudC4NCi0NCi1XaGVuIHNwYWNlIHBlcm1pdHMsIGluY2x1c2lvbiBvZiB0aGUgZnVsbCB0ZXh0IG9mIHRoaXMgTk9USUNFIHNob3VsZCBiZSBwcm92aWRlZC4gV2UgcmVxdWVzdCB0aGF0IGF1dGhvcnNoaXAgYXR0cmlidXRpb24gYmUgcHJvdmlkZWQgaW4gYW55IHNvZnR3YXJlLCBkb2N1bWVudHMsIG9yIG90aGVyIGl0ZW1zIG9yIHByb2R1Y3RzIHRoYXQgeW91IGNyZWF0ZSBwdXJzdWFudCB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZG9jdW1lbnQsIG9yIGFueSBwb3J0aW9uIHRoZXJlb2YuDQotDQotTm8gcmlnaHQgdG8gY3JlYXRlIG1vZGlmaWNhdGlvbnMgb3IgZGVyaXZhdGl2ZXMgb2YgVzNDIGRvY3VtZW50cyBpcyBncmFudGVkIHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZS4gSG93ZXZlciwgaWYgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgKGRvY3VtZW50ZWQgaW4gdGhlIENvcHlyaWdodCBGQVEpIGFyZSBzYXRpc2ZpZWQsIHRoZSByaWdodCB0byBjcmVhdGUgbW9kaWZpY2F0aW9ucyBvciBkZXJpdmF0aXZlcyBpcyBzb21ldGltZXMgZ3JhbnRlZCBieSB0aGUgVzNDIHRvIGluZGl2aWR1YWxzIGNvbXBseWluZyB3aXRoIHRob3NlIHJlcXVpcmVtZW50cy4NCi0NCi1USElTIERPQ1VNRU5UIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE5PTi1JTkZSSU5HRU1FTlQsIE9SIFRJVExFOyBUSEFUIFRIRSBDT05URU5UUyBPRiBUSEUgRE9DVU1FTlQgQVJFIFNVSVRBQkxFIEZPUiBBTlkgUFVSUE9TRTsgTk9SIFRIQVQgVEhFIElNUExFTUVOVEFUSU9OIE9GIFNVQ0ggQ09OVEVOVFMgV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLg0KLQ0KLUNPUFlSSUdIVCBIT0xERVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIERPQ1VNRU5UIE9SIFRIRSBQRVJGT1JNQU5DRSBPUiBJTVBMRU1FTlRBVElPTiBPRiBUSEUgQ09OVEVOVFMgVEhFUkVPRi4NCi0NCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhpcyBkb2N1bWVudCBvciBpdHMgY29udGVudHMgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcyBkb2N1bWVudCB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotVGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbiBEZWNlbWJlciAzMSAyMDAyLiBUaGlzIHZlcnNpb24gcmVtb3ZlcyB0aGUgY29weXJpZ2h0IG93bmVyc2hpcCBub3RpY2Ugc3VjaCB0aGF0IHRoaXMgbGljZW5zZSBjYW4gYmUgdXNlZCB3aXRoIG1hdGVyaWFscyBvdGhlciB0aGFuIHRob3NlIG93bmVkIGJ5IHRoZSBXM0MsIG1vdmVzIGluZm9ybWF0aW9uIG9uIHN0eWxlIHNoZWV0cywgRFREcywgYW5kIHNjaGVtYXMgdG8gdGhlIENvcHlyaWdodCBGQVEsIHJlZmxlY3RzIHRoYXQgRVJDSU0gaXMgbm93IGEgaG9zdCBvZiB0aGUgVzNDLCBpbmNsdWRlcyByZWZlcmVuY2VzIHRvIHRoaXMgc3BlY2lmaWMgZGF0ZWQgdmVyc2lvbiBvZiB0aGUgbGljZW5zZSwgYW5kIHJlbW92ZXMgdGhlIGFtYmlndW91cyBncmFudCBvZiAidXNlIi4gU2VlIHRoZSBvbGRlciBmb3JtdWxhdGlvbiBmb3IgdGhlIHBvbGljeSBwcmlvciB0byB0aGlzIGRhdGUuIFBsZWFzZSBzZWUgb3VyIENvcHlyaWdodCBGQVEgZm9yIGNvbW1vbiBxdWVzdGlvbnMgYWJvdXQgdXNpbmcgbWF0ZXJpYWxzIGZyb20gb3VyIHNpdGUsIHN1Y2ggYXMgdGhlIHRyYW5zbGF0aW5nIG9yIGFubm90YXRpbmcgc3BlY2lmaWNhdGlvbnMuIE90aGVyIHF1ZXN0aW9ucyBhYm91dCB0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gc2l0ZS1wb2xpY3lAdzMub3JnLg0KLQ0KLUpvc2VwaCBSZWFnbGUgPHNpdGUtcG9saWN5QHczLm9yZz4NCi0NCi1MYXN0IHJldmlzZWQgJElkOiBjb3B5cmlnaHQtZG9jdW1lbnRzLTIwMDIxMjMxLmh0bWwsdiAxLjYgMjAwNC8wNy8wNiAxNjowMjo0OSBzbGVzY2ggRXhwICQNCi0NCi0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotPT0gIE9BU0lTIE5vdGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1PQVNJUyB0YWtlcyBubyBwb3NpdGlvbiByZWdhcmRpbmcgdGhlIHZhbGlkaXR5IG9yIHNjb3BlIG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb3Igb3RoZXIgcmlnaHRzIHRoYXQgbWlnaHQgYmUgY2xhaW1lZCB0byBwZXJ0YWluIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvciB1c2Ugb2YgdGhlIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQgb3IgdGhlIGV4dGVudCB0byB3aGljaCBhbnkgbGljZW5zZSB1bmRlciBzdWNoIHJpZ2h0cyBtaWdodCBvciBtaWdodCBub3QgYmUgYXZhaWxhYmxlOyBuZWl0aGVyIGRvZXMgaXQgcmVwcmVzZW50IHRoYXQgaXQgaGFzIG1hZGUgYW55IGVmZm9ydCB0byBpZGVudGlmeSBhbnkgc3VjaCByaWdodHMuIEluZm9ybWF0aW9uIG9uIE9BU0lTJ3MgcHJvY2VkdXJlcyB3aXRoIHJlc3BlY3QgdG8gcmlnaHRzIGluIE9BU0lTIHNwZWNpZmljYXRpb25zIGNhbiBiZSBmb3VuZCBhdCB0aGUgT0FTSVMgd2Vic2l0ZS4gQ29waWVzIG9mIGNsYWltcyBvZiByaWdodHMgbWFkZSBhdmFpbGFibGUgZm9yIHB1YmxpY2F0aW9uIGFuZCBhbnkgYXNzdXJhbmNlcyBvZiBsaWNlbnNlcyB0byBiZSBtYWRlIGF2YWlsYWJsZSwgb3IgdGhlIHJlc3VsdCBvZiBhbiBhdHRlbXB0IG1hZGUgdG8gb2J0YWluIGEgZ2VuZXJhbCBsaWNlbnNlIG9yIHBlcm1pc3Npb24gZm9yIHRoZSB1c2Ugb2Ygc3VjaCBwcm9wcmlldGFyeSByaWdodHMgYnkgaW1wbGVtZW50b3JzIG9yIHVzZXJzIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiwgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIE9BU0lTIEV4ZWN1dGl2ZSBEaXJlY3Rvci4NCi0NCi1PQVNJUyBpbnZpdGVzIGFueSBpbnRlcmVzdGVkIHBhcnR5IHRvIGJyaW5nIHRvIGl0cyBhdHRlbnRpb24gYW55IGNvcHlyaWdodHMsIHBhdGVudHMgb3IgcGF0ZW50IGFwcGxpY2F0aW9ucywgb3Igb3RoZXIgcHJvcHJpZXRhcnkgcmlnaHRzIHdoaWNoIG1heSBjb3ZlciB0ZWNobm9sb2d5IHRoYXQgbWF5IGJlIHJlcXVpcmVkIHRvIGltcGxlbWVudCB0aGlzIHNwZWNpZmljYXRpb24uIFBsZWFzZSBhZGRyZXNzIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgT0FTSVMgRXhlY3V0aXZlIERpcmVjdG9yLg0KLQ0KLUNvcHlyaWdodCAoQykgT0FTSVMgT3BlbiAoMjAwNC0yMDA1KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0NCi1UaGlzIGRvY3VtZW50IGFuZCB0cmFuc2xhdGlvbnMgb2YgaXQgbWF5IGJlIGNvcGllZCBhbmQgZnVybmlzaGVkIHRvIG90aGVycywgYW5kIGRlcml2YXRpdmUgd29ya3MgdGhhdCBjb21tZW50IG9uIG9yIG90aGVyd2lzZSBleHBsYWluIGl0IG9yIGFzc2lzdCBpbiBpdHMgaW1wbGVtZW50YXRpb24gbWF5IGJlIHByZXBhcmVkLCBjb3BpZWQsIHB1Ymxpc2hlZCBhbmQgZGlzdHJpYnV0ZWQsIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgcmVzdHJpY3Rpb24gb2YgYW55IGtpbmQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZSBpbmNsdWRlZCBvbiBhbGwgc3VjaCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MuIEhvd2V2ZXIsIHRoaXMgZG9jdW1lbnQgaXRzZWxmIG1heSBub3QgYmUgbW9kaWZpZWQgaW4gYW55IHdheSwgc3VjaCBhcyBieSByZW1vdmluZyB0aGUgY29weXJpZ2h0IG5vdGljZSBvciByZWZlcmVuY2VzIHRvIE9BU0lTLCBleGNlcHQgYXMgbmVlZGVkIGZvciB0aGUgcHVycG9zZSBvZiBkZXZlbG9waW5nIE9BU0lTIHNwZWNpZmljYXRpb25zLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9jZWR1cmVzIGZvciBjb3B5cmlnaHRzIGRlZmluZWQgaW4gdGhlIE9BU0lTIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBSaWdodHMgZG9jdW1lbnQgbXVzdCBiZSBmb2xsb3dlZCwgb3IgYXMgcmVxdWlyZWQgdG8gdHJhbnNsYXRlIGl0IGludG8gbGFuZ3VhZ2VzIG90aGVyIHRoYW4gRW5nbGlzaC4gDQotDQotVGhlIGxpbWl0ZWQgcGVybWlzc2lvbnMgZ3JhbnRlZCBhYm92ZSBhcmUgcGVycGV0dWFsIGFuZCB3aWxsIG5vdCBiZSByZXZva2VkIGJ5IE9BU0lTIG9yIGl0cyBzdWNjZXNzb3JzIG9yIGFzc2lnbnMuIA0KLQ0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzIHByb3ZpZGVkIG9uIGFuICJBUyBJUyIgYmFzaXMgYW5kIE9BU0lTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5UWSBUSEFUIFRIRSBVU0UgT0YgVEhFIElORk9STUFUSU9OIEhFUkVJTiBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgUklHSFRTIE9SIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VtaXgtYnVpbGQvcG9tLnhtbCBiL3NlcnZpY2VtaXgtYnVpbGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyNWZlYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlbWl4LWJ1aWxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotPCEtLQotCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2VydmljZW1peC50b29saW5nPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbnMtcG9tPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjM8L3ZlcnNpb24+Ci0gICAgPHJlbGF0aXZlUGF0aD4uLi9tYXZlbi1wbHVnaW5zLXBvbS9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+ICAgIAotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPm9yZy5hcGFjaGUuc2VydmljZW1peDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+c2VydmljZW1peC1idWlsZDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIFNlcnZpY2VNaXggOjogUGx1Z2lucyA6OiBCdWlsZDwvbmFtZT4KLSAgCi0gIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgYnVpbGQgcGx1Z2luIGhhcyAzIHB1cnBvc2VzOgotICAgICAgICAqIGxlZ2FsIHN0dWZmIChub3RpY2UvbGljKQotICAgICAgICAqIHNvbWUgcmVzb3VyY2VzIGZvciBjaGVja3N0eWxlIC8gcG1kIAotICAgICAgICAqIHNwcmluZy5zY2hlbWFzIG1vam8KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9zZXJ2aWNlbWl4L21hdmVuLXBsdWdpbnMvc2VydmljZW1peC1idWlsZC90cnVuazwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NlcnZpY2VtaXgvbWF2ZW4tcGx1Z2lucy9zZXJ2aWNlbWl4LWJ1aWxkL3RydW5rPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL3NlcnZpY2VtaXgvbWF2ZW4tcGx1Z2lucy9zZXJ2aWNlbWl4LWJ1aWxkL3RydW5rPC91cmw+Ci0gIDwvc2NtPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC45PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoaXZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS41LjU8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNjcmlwdC1hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmxlZ2FsLWZpbGVzPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L0xJQ0VOU0UiIHRvZmlsZT0iJHtiYXNlZGlyfS90YXJnZXQvbGVnYWwvTUVUQS1JTkYvTElDRU5TRSIvPgotICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vTk9USUNFIiB0b2ZpbGU9IiR7YmFzZWRpcn0vdGFyZ2V0L2xlZ2FsL01FVEEtSU5GL05PVElDRSIvPgotICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vTElDRU5TRSIgdG9maWxlPSIke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL01FVEEtSU5GL0xJQ0VOU0UiLz4KLSAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L05PVElDRSIgdG9maWxlPSIke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL01FVEEtSU5GL05PVElDRSIvPgotICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICA8c291cmNlUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC9sZWdhbDwvc291cmNlUm9vdD4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi9sZWdhbC9MZWdhbE1vam8uamF2YSBiL3NlcnZpY2VtaXgtYnVpbGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2xlZ2FsL0xlZ2FsTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTgzMTNiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VtaXgtYnVpbGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL2xlZ2FsL0xlZ2FsTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLmxlZ2FsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi0vKioKLSAqCi0gKiBAZ29hbCBjb3B5Ci0gKiBAcGhhc2UgZ2VuZXJhdGUtcmVzb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBMZWdhbE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8gewotCi0gICAgLyoqCi0gICAgICogVGhlIG1hdmVuIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXZlblByb2plY3QgcHJvamVjdDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEZpbGUgb3V0cHV0RGlyOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb3B5TGVnYWxGaWxlcyhvdXRwdXREaXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9qZWN0LmdldFBhY2thZ2luZygpLmVxdWFscygiamFyIikpIHsKLSAgICAgICAgICAgICAgICBjb3B5TGVnYWxGaWxlcyhuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwgInRhcmdldC9jbGFzc2VzLyIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvamVjdC5nZXRQYWNrYWdpbmcoKS5lcXVhbHMoIm1hdmVuLXBsdWdpbiIpKSB7Ci0gICAgICAgICAgICAgICAgY29weUxlZ2FsRmlsZXMobmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksICJ0YXJnZXQvY2xhc3Nlcy8iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2plY3QuZ2V0UGFja2FnaW5nKCkuZXF1YWxzKCJ3YXIiKSkgewotICAgICAgICAgICAgICAgIGNvcHlMZWdhbEZpbGVzKG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCAidGFyZ2V0LyIgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICItIiArIHByb2plY3QuZ2V0VmVyc2lvbigpICsgIi8iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2plY3QuZ2V0UGFja2FnaW5nKCkuZXF1YWxzKCJqYmktc2hhcmVkLWxpYnJhcnkiKSkgewotICAgICAgICAgICAgICAgIGNvcHlMZWdhbEZpbGVzKG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCAidGFyZ2V0L2NsYXNzZXMvIikpOwotICAgICAgICAgICAgICAgIGNvcHlMZWdhbEZpbGVzKG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCAidGFyZ2V0LyIgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICItIiArIHByb2plY3QuZ2V0VmVyc2lvbigpICsgIi1pbnN0YWxsZXIvIikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9qZWN0LmdldFBhY2thZ2luZygpLmVxdWFscygiamJpLWNvbXBvbmVudCIpKSB7Ci0gICAgICAgICAgICAgICAgY29weUxlZ2FsRmlsZXMobmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksICJ0YXJnZXQvY2xhc3Nlcy8iKSk7Ci0gICAgICAgICAgICAgICAgY29weUxlZ2FsRmlsZXMobmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksICJ0YXJnZXQvIiArIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi0iICsgcHJvamVjdC5nZXRWZXJzaW9uKCkgKyAiLWluc3RhbGxlci8iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2plY3QuZ2V0UGFja2FnaW5nKCkuZXF1YWxzKCJqYmktc2VydmljZS11bml0IikpIHsKLSAgICAgICAgICAgICAgICBjb3B5TGVnYWxGaWxlcyhuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwgInRhcmdldC9jbGFzc2VzLyIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvamVjdC5nZXRQYWNrYWdpbmcoKS5lcXVhbHMoImpiaS1zZXJ2aWNlLWFzc2VtYmx5IikpIHsKLSAgICAgICAgICAgICAgICBjb3B5TGVnYWxGaWxlcyhuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwgInRhcmdldC9jbGFzc2VzLyIpKTsKLSAgICAgICAgICAgICAgICBjb3B5TGVnYWxGaWxlcyhuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwgInRhcmdldC8iICsgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKyAiLSIgKyBwcm9qZWN0LmdldFZlcnNpb24oKSArICItaW5zdGFsbGVyLyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBjb3B5IGxlZ2FsIGZpbGVzIiwgZSk7Ci0gICAgICAgIH0KLSAgCX0KLSAgCQotICAJcHJvdGVjdGVkIHZvaWQgY29weUxlZ2FsRmlsZXMoRmlsZSBvdXRwdXREaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzID0geyAiL01FVEEtSU5GL05PVElDRSIsICIvTUVUQS1JTkYvTElDRU5TRSJ9OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBVUkwgcmVzID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShuYW1lc1tpXSk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weVVSTFRvRmlsZShyZXMsIG5ldyBGaWxlKG91dHB1dERpciwgbmFtZXNbaV0pKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2VydmljZW1peC1idWlsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4veHNkL1NwcmluZ1NjaGVtYXNNb2pvLmphdmEgYi9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi94c2QvU3ByaW5nU2NoZW1hc01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3Njk4Yy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi94c2QvU3ByaW5nU2NoZW1hc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4ueHNkOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBNb2pvIHRvIGFkZCBzY2hlbWEgbG9jYXRpb24gbWFwcGluZyBmb3IgZWFybGllciB2ZXJzaW9ucyB0byB0aGUgc3ByaW5nLnNjaGVtYXMgZmlsZQotICogCi0gKiBAZ29hbCBzcHJpbmcuc2NoZW1hcwotICogQHBoYXNlIHByb2Nlc3MtcmVzb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBTcHJpbmdTY2hlbWFzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbyB7Ci0KLSAgICAvKioKLSAgICAgKiBNYXZlbiBwcm9qZWN0IHByb3BlcnR5IGNvbnRhaW5pbmcgcHJldmlvdXMgcmVsZWFzZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklPVVNfUkVMRUFTRVMgPSAicHJldmlvdXMucmVsZWFzZXMiOwotCi0gICAgLyoqCi0gICAgICogUHJldmlvdXNseSByZWxlYXNlZCB2ZXJzaW9ucyBvZiBTZXJ2aWNlTWl4Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwcmV2aW91cyA9IHt9OwotCi0gICAgLyoqCi0gICAgICogTG9jYXRpb24gVVJJcwotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChTdHJpbmcgZWxlbWVudCkgewotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiQWRkaW5nIGxvY2F0aW9uICIgKyBlbGVtZW50KTsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5hZGQoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgWFNEIGZpbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzY2hlbWE7Ci0KLSAgICAvKioKLSAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgTWF2ZW4gcHJvamVjdAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZ2V0U3ByaW5nU2NoZW1hcygpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJTa2lwcGluZyAtIHNwcmluZy5zY2hlbWFzIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gIiArIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICByZWFkT3JpZ2luYWxTcHJpbmdTY2hlbWFzKCk7Ci0gICAgICAgIGdldExvZygpLmluZm8oIkFkZGluZyBzcHJpbmcuc2NoZW1hcyBlbnRyaWVzIGZvciBlYXJsaWVyIHZlcnNpb25zIik7Ci0gICAgICAgIGlmIChwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleShQUkVWSU9VU19SRUxFQVNFUykpIHsKLSAgICAgICAgICAgIHByZXZpb3VzID0gKChTdHJpbmcpIHByb2plY3QuZ2V0UHJvcGVydGllcygpLmdldChQUkVWSU9VU19SRUxFQVNFUykpLnNwbGl0KCIsIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRMb2coKS53YXJuKCJObyBwcmV2aW91cyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvdW5kIik7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBrZXkgOiBwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIiciICsga2V5LnRvU3RyaW5nKCkgKyAiJyIgKyAiID0gIiArIHByb2plY3QuZ2V0UHJvcGVydGllcygpLmdldChrZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKFN0cmluZyB2ZXJzaW9uIDogcHJldmlvdXMpIHsKLSAgICAgICAgICAgIGFkZFZlcnNpb24odmVyc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiQWRkaW5nIHNwcmluZy5zY2hlbWFzIGVudHJ5IGZvciB0aGlzIHZlcnNpb24iKTsKLSAgICAgICAgYWRkVmVyc2lvbihwcm9qZWN0LmdldFZlcnNpb24oKSk7Ci0gICAgICAgIHdyaXRlTmV3U3ByaW5nU2NoZW1hcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBuZXcgc3ByaW5nLnNjaGVtYXMgZmlsZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU5ld1NwcmluZ1NjaGVtYXMoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIldyaXRpbmcgbmV3IHNwcmluZy5zY2hlbWFzIGZpbGUiKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZ2V0U3ByaW5nU2NoZW1hcygpKSkpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgbG9jYXRpb24gOiBsb2NhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihsb2NhdGlvbiArICI9IiArIHNjaGVtYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIHNwcmluZy5zY2hlbWFzIGZpbGUiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgb3JpZ2luYWwgc3ByaW5nLnNjaGVtYXMgZmlsZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT3JpZ2luYWxTcHJpbmdTY2hlbWFzKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBnZXRMb2coKS5pbmZvKCJSZWFkaW5nIGluZm9ybWF0aW9uIGZyb20gc3ByaW5nLnNjaGVtYXMiKTsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihnZXRTcHJpbmdTY2hlbWFzKCkpKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9za2lwIGFueSBsaW5lcyB0aGF0IGRvbid0IGNvbnRhaW4gYSBtYXBwaW5nCi0gICAgICAgICAgICAgICAgaWYgKGxpbmUuY29udGFpbnMoIj0iKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBpbmZvID0gbGluZS5zcGxpdCgiPSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIlNjaGVtYSBuYW1lIGlzICIgKyBpbmZvWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IGluZm9bMV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25zLmFkZChpbmZvWzBdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIHNwcmluZy5zY2hlbWFzIGZpbGUiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIHNwcmluZy5zY2hlbWFzIGZpbGUiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBjbG9zZSBmaWxlIHJlYWRlciIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHNwcmluZy5zY2hlbWFzIGZpbGUgZ2VuZXJhdGVkIGJ5IHhiZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGdldFNwcmluZ1NjaGVtYXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgInRhcmdldCIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiY2xhc3NlcyIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiTUVUQS1JTkYiLCAic3ByaW5nLnNjaGVtYXMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSB2ZXJzaW9uIG9mIHRoZSBYU0QgdG8gdGhlIHNwcmluZy5zY2hlbWFzIGZpbGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiB0byBiZSBhZGRlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIGxvY2F0aW9ucy5hZGQoImh0dHBcXDovL3NlcnZpY2VtaXguYXBhY2hlLm9yZy9zY2hlbWEvIiArIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi0iICsgdmVyc2lvbiArICIueHNkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9ub3RpY2Utc3VwcGxlbWVudHMueG1sIGIvc2VydmljZW1peC1idWlsZC9zcmMvbWFpbi9yZXNvdXJjZXMvbm90aWNlLXN1cHBsZW1lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiYjVjOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9ub3RpY2Utc3VwcGxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c3VwcGxlbWVudGFsRGF0YU1vZGVscz4KLSAgPHN1cHBsZW1lbnQ+Ci0gICAgPHByb2plY3Q+Ci0gICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgPG5hbWU+U3VuIEpBWEIgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIFJ1bnRpbWU8L25hbWU+Ci0gICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgotICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KLSAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgPGxpY2Vuc2VzPgotICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KLSAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgotICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICA8L2xpY2Vuc2VzPgotICAgIDwvcHJvamVjdD4KLSAgPC9zdXBwbGVtZW50PgotICA8c3VwcGxlbWVudD4KLSAgICA8cHJvamVjdD4KLSAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KLSAgICAgIDxuYW1lPlN1biBKQVhCIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBUb29sczwvbmFtZT4KLSAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgIDxuYW1lPlN1biBNaWNyb3N5c3RlbXM8L25hbWU+Ci0gICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgotICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICA8bGljZW5zZXM+Ci0gICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgIDxuYW1lPkNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wPC9uYW1lPgotICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sPC91cmw+Ci0gICAgICAgIDwvbGljZW5zZT4KLSAgICAgIDwvbGljZW5zZXM+Ci0gICAgPC9wcm9qZWN0PgotICA8L3N1cHBsZW1lbnQ+Ci0gIDxzdXBwbGVtZW50PgotICAgIDxwcm9qZWN0PgotICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwubWVzc2FnaW5nLnNhYWo8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zYWFqLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8bmFtZT5TdW4gU0FBSiBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb248L25hbWU+Ci0gICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgotICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KLSAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgPGxpY2Vuc2VzPgotICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KLSAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgotICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICA8L2xpY2Vuc2VzPgotICAgIDwvcHJvamVjdD4KLSAgPC9zdXBwbGVtZW50PgotICA8c3VwcGxlbWVudD4KLSAgICA8cHJvamVjdD4KLSAgICAgIDxncm91cElkPmphdmF4LnhtbC5zb2FwPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c2Fhai1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8bmFtZT5TdW4gU0FBSiBBUEk8L25hbWU+Ci0gICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zPC9uYW1lPgotICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KLSAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgPGxpY2Vuc2VzPgotICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICA8bmFtZT5DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMDwvbmFtZT4KLSAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgotICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICA8L2xpY2Vuc2VzPgotICAgIDwvcHJvamVjdD4KLSAgPC9zdXBwbGVtZW50PgotICA8c3VwcGxlbWVudD4KLSAgICA8cHJvamVjdD4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgPG5hbWU+TmVldGhpPC9uYW1lPgotICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgotICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KLSAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgPGxpY2Vuc2VzPgotICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgotICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgotICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICA8L2xpY2Vuc2VzPgotICAgIDwvcHJvamVjdD4KLSAgPC9zdXBwbGVtZW50PgotICA8c3VwcGxlbWVudD4KLSAgICA8cHJvamVjdD4KLSAgICAgIDxncm91cElkPmphdmF4LnhtbC53czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpheHdzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDxuYW1lPkphdmEgQVBJIGZvciBYTUwtQmFzZWQgV2ViIFNlcnZpY2VzIChKQVgtV1MgQVBJKTwvbmFtZT4KLSAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgIDxuYW1lPlN1biBNaWNyb3N5c3RlbXM8L25hbWU+Ci0gICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgotICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICA8bGljZW5zZXM+Ci0gICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgIDxuYW1lPkNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wPC9uYW1lPgotICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sPC91cmw+Ci0gICAgICAgIDwvbGljZW5zZT4KLSAgICAgIDwvbGljZW5zZXM+Ci0gICAgPC9wcm9qZWN0PgotICA8L3N1cHBsZW1lbnQ+Ci0gIDxzdXBwbGVtZW50PgotICAgIDxwcm9qZWN0PgotICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDxuYW1lPkphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQiBBUEkpPC9uYW1lPgotICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtczwvbmFtZT4KLSAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vPC91cmw+Ci0gICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgPG5hbWU+Q09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjA8L25hbWU+Ci0gICAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWw8L3VybD4KLSAgICAgICAgPC9saWNlbnNlPgotICAgICAgPC9saWNlbnNlcz4KLSAgICA8L3Byb2plY3Q+Ci0gIDwvc3VwcGxlbWVudD4KLSAgPHN1cHBsZW1lbnQ+Ci0gICAgPHByb2plY3Q+Ci0gICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnhhbGFuPC9hcnRpZmFjdElkPgotICAgICAgPG5hbWU+QXBhY2hlIFhhbGFuLUphdmE8L25hbWU+Ci0gICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+Ci0gICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnPC91cmw+Ci0gICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KLSAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KLSAgICAgICAgPC9saWNlbnNlPgotICAgICAgPC9saWNlbnNlcz4KLSAgICA8L3Byb2plY3Q+Ci0gIDwvc3VwcGxlbWVudD4KLSAgPHN1cHBsZW1lbnQ+Ci0gICAgPHByb2plY3Q+Ci0gICAgICA8Z3JvdXBJZD5uZXQuamF2YS5kZXYuc3RheC11dGlsczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnN0YXgtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8bmFtZT5TdEFYIFV0aWxpdGllczwvbmFtZT4KLSAgICA8L3Byb2plY3Q+Ci0gIDwvc3VwcGxlbWVudD4KLSAgPHN1cHBsZW1lbnQ+Ci0gICAgPHByb2plY3Q+Ci0gICAgICA8Z3JvdXBJZD53c3M0ajwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPndzczRqPC9hcnRpZmFjdElkPgotICAgICAgPG5hbWU+QXBhY2hlIFdTUzRKPC9uYW1lPgotICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgotICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZzwvdXJsPgotICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICA8bGljZW5zZXM+Ci0gICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+Ci0gICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+Ci0gICAgICAgIDwvbGljZW5zZT4KLSAgICAgIDwvbGljZW5zZXM+Ci0gICAgPC9wcm9qZWN0PgotICA8L3N1cHBsZW1lbnQ+Ci0gIDxzdXBwbGVtZW50PgotICAgIDxwcm9qZWN0PgotICAgICAgPGdyb3VwSWQ+amRvbTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpkb208L2FydGlmYWN0SWQ+Ci0gICAgICA8bmFtZT5KRE9NPC9uYW1lPgotICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgPG5hbWU+amRvbS5vcmc8L25hbWU+Ci0gICAgICAgIDx1cmw+aHR0cDovL3d3dy5qZG9tLm9yZzwvdXJsPgotICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICA8bGljZW5zZXM+Ci0gICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgIDxuYW1lPk1vZGlmaWVkIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC9uYW1lPgotICAgICAgICAgIDx1cmw+bGljZW5zZXMvamRvbS50eHQ8L3VybD4KLSAgICAgICAgPC9saWNlbnNlPgotICAgICAgPC9saWNlbnNlcz4KLSAgICA8L3Byb2plY3Q+Ci0gIDwvc3VwcGxlbWVudD4KLSAgPHN1cHBsZW1lbnQ+Ci0gICAgPHByb2plY3Q+Ci0gICAgICA8Z3JvdXBJZD54bWwtc2VjdXJpdHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD54bWxzZWM8L2FydGlmYWN0SWQ+Ci0gICAgICA8bmFtZT5YTUwgU2VjdXJpdHk8L25hbWU+Ci0gICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+Ci0gICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnPC91cmw+Ci0gICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KLSAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KLSAgICAgICAgPC9saWNlbnNlPgotICAgICAgPC9saWNlbnNlcz4KLSAgICA8L3Byb2plY3Q+Ci0gIDwvc3VwcGxlbWVudD4KLSAgPHN1cHBsZW1lbnQ+Ci0gICAgPHByb2plY3Q+Ci0gICAgICA8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgotICAgICAgPG5hbWU+WE1MIEFQSXM8L25hbWU+Ci0gICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+Ci0gICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnPC91cmw+Ci0gICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KLSAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KLSAgICAgICAgPC9saWNlbnNlPgotICAgICAgPC9saWNlbnNlcz4KLSAgICA8L3Byb2plY3Q+Ci0gIDwvc3VwcGxlbWVudD4KLSAgPHN1cHBsZW1lbnQ+Ci0gICAgPHByb2plY3Q+Ci0gICAgICA8Z3JvdXBJZD5ib3VuY3ljYXN0bGU8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5iY3Byb3YtamRrMTQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8bmFtZT5Cb3VuY3kgQ2FzdGxlIENyeXB0byBBUElzIGZvciBKYXZhPC9uYW1lPgotICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgPG5hbWU+VGhlIExlZ2lvbiBvZiB0aGUgQm91bmN5IENhc3RsZTwvbmFtZT4KLSAgICAgICAgPHVybD5odHRwOi8vd3d3LmJvdW5jeWNhc3RsZS5vcmc8L3VybD4KLSAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgPGxpY2Vuc2VzPgotICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICA8bmFtZT5Cb3VuY3kgQ2FzdGxlIExpY2Vuc2U8L25hbWU+Ci0gICAgICAgICAgPHVybD5odHRwOi8vd3d3LmJvdW5jeWNhc3RsZS5vcmcvbGljZW5jZS5odG1sPC91cmw+Ci0gICAgICAgIDwvbGljZW5zZT4KLSAgICAgIDwvbGljZW5zZXM+Ci0gICAgPC9wcm9qZWN0PgotICA8L3N1cHBsZW1lbnQ+Ci0gIDxzdXBwbGVtZW50PgotICAgIDxwcm9qZWN0PgotICAgICAgPGdyb3VwSWQ+YW50PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgPG5hbWU+QXBhY2hlIEFudDwvbmFtZT4KLSAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KLSAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmc8L3VybD4KLSAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgPGxpY2Vuc2VzPgotICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgotICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgotICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICA8L2xpY2Vuc2VzPgotICAgIDwvcHJvamVjdD4KLSAgPC9zdXBwbGVtZW50PgotICA8c3VwcGxlbWVudD4KLSAgICA8cHJvamVjdD4KLSAgICAgIDxncm91cElkPmFudDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFudC1ub2RlcHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8bmFtZT5BcGFjaGUgQW50IChub2RlcHMpPC9uYW1lPgotICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgotICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZzwvdXJsPgotICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICA8bGljZW5zZXM+Ci0gICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+Ci0gICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+Ci0gICAgICAgIDwvbGljZW5zZT4KLSAgICAgIDwvbGljZW5zZXM+Ci0gICAgPC9wcm9qZWN0PgotICA8L3N1cHBsZW1lbnQ+Ci0gIDxzdXBwbGVtZW50PgotICAgIDxwcm9qZWN0PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmpldHRpc29uPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+amV0dGlzb248L2FydGlmYWN0SWQ+Ci0gICAgICA8bmFtZT5KZXR0aXNvbjwvbmFtZT4KLSAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgIDxuYW1lPkVudm9pIFNvbHV0aW9ucyBMTEM8L25hbWU+Ci0gICAgICAgIDx1cmw+aHR0cDovL3d3dy5lbnZvaXNvbHV0aW9ucy5jb208L3VybD4KLSAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgPGxpY2Vuc2VzPgotICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgotICAgICAgICAgIDx1cmw+aHR0cDovL2pldHRpc29uLmNvZGVoYXVzLm9yZy9MaWNlbnNlPC91cmw+Ci0gICAgICAgIDwvbGljZW5zZT4KLSAgICAgIDwvbGljZW5zZXM+Ci0gICAgPC9wcm9qZWN0PgotICA8L3N1cHBsZW1lbnQ+Ci08L3N1cHBsZW1lbnRhbERhdGFNb2RlbHM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtY2hlY2tzdHlsZS1oZWFkZXIudHh0IGIvc2VydmljZW1peC1idWlsZC9zcmMvbWFpbi9yZXNvdXJjZXMvc214LWNoZWNrc3R5bGUtaGVhZGVyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4NTkxMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtY2hlY2tzdHlsZS1oZWFkZXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotXi9cKiQKLV4gXCogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIFwoQVNGXCkgdW5kZXIgb25lIG9yIG1vcmUkCi1eIFwqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCQKLV4gXCogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiQKLV4gXCogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAkCi1eIFwqIFwodGhlICJMaWNlbnNlIlwpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgkCi1eIFwqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JAotXiBcKiQKLV4gXCogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAkCi1eIFwqJAotXiBcKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlJAotXiBcKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCQKLV4gXCogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuJAotXiBcKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kJAotXiBcKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4kCi1eIFwqLyQKLV5wYWNrYWdlIAotXiQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtY2hlY2tzdHlsZS1zdXBwcmVzc2lvbnMueG1sIGIvc2VydmljZW1peC1idWlsZC9zcmMvbWFpbi9yZXNvdXJjZXMvc214LWNoZWNrc3R5bGUtc3VwcHJlc3Npb25zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjMTFkZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtY2hlY2tzdHlsZS1zdXBwcmVzc2lvbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgc3VwcHJlc3Npb25zIFBVQkxJQwotICAgICItLy9QdXBweSBDcmF3bC8vRFREIFN1cHByZXNzaW9ucyAxLjAvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvc3VwcHJlc3Npb25zXzFfMC5kdGQiPgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08c3VwcHJlc3Npb25zPgotICAgIDxzdXBwcmVzcyBjaGVja3M9Ii4qIgotICAgICAgICAgICAgICBmaWxlcz0iLitbXFxcL11nZW5lcmF0ZWRbXFxcL10uK1wuamF2YSIgLz4KLSAgICA8c3VwcHJlc3MgY2hlY2tzPSJJbGxlZ2FsVHlwZSIKLSAgICAgICAgICAgICAgZmlsZXM9Ii4rW1xcXC9dSmJpSW52b2tlQWN0aW9uXC5qYXZhIiAvPgotICAgIDxzdXBwcmVzcyBjaGVja3M9IlRocm93c0NvdW50IgotICAgICAgICAgICAgICBmaWxlcz0iLitbXFxcL113c25bXFxcL10uK3xKQ0FGbG93LmphdmEiIC8+Ci0gICAgPHN1cHByZXNzIGNoZWNrcz0iUGFyYW1ldGVyTnVtYmVyIiAKLSAgICAgICAgICAgICAgZmlsZXM9IihHcmFwaEFydGlmYWN0Q29sbGVjdG9yXC5qYXZhKXwoSmJpQ29tcG9uZW50RGVzY3JpcHRvcldyaXRlci5qYXZhKSIgLz4KLSAgICA8c3VwcHJlc3MgY2hlY2tzPSJQYXJhbWV0ZXJOdW1iZXIiCi0gICAgICAgICAgICAgIGZpbGVzPSIuK1tcXFwvXUpCSUNvbnRhaW5lclwuamF2YSIgLz4KLSAgICA8c3VwcHJlc3MgY2hlY2tzPSJJbnRlcmZhY2VJc1R5cGUiCi0gICAgICAgICAgICAgIGZpbGVzPSIuK1tcXFwvXUpiaUNvbnN0YW50c1wuamF2YSIgLz4KLSAgICA8c3VwcHJlc3MgY2hlY2tzPSJJbnRlcmZhY2VJc1R5cGUiCi0gICAgICAgICAgICAgIGZpbGVzPSIuK1tcXFwvXVdTQWRkcmVzc2luZ0NvbnN0YW50c1wuamF2YSIgLz4KLQk8c3VwcHJlc3MgY2hlY2tzPSJFeGVjdXRhYmxlU3RhdGVtZW50Q291bnQiCi0gICAgICAgIAkgIGZpbGVzPSIuK1tcXFwvXURlcGxveW1lbnRUZXN0XC5qYXZhIiAvPgotCTxzdXBwcmVzcyBjaGVja3M9IkphdmFOQ1NTIgotICAgICAgICAJICBmaWxlcz0iLitbXFxcL11EZXBsb3ltZW50VGVzdFwuamF2YSIgLz4KLQk8c3VwcHJlc3MgY2hlY2tzPSJFeGVjdXRhYmxlU3RhdGVtZW50Q291bnQiCi0gICAgICAgIAkgIGZpbGVzPSIuK1tcXFwvXUluc3RhbGxhdGlvblRlc3RcLmphdmEiIC8+Ci0JPHN1cHByZXNzIGNoZWNrcz0iSmF2YU5DU1MiCi0gICAgICAgIAkgIGZpbGVzPSIuK1tcXFwvXUluc3RhbGxhdGlvblRlc3RcLmphdmEiIC8+Ci0gICAgPHN1cHByZXNzIGNoZWNrcz0iTGluZUxlbmd0aCIKLSAgICAgICAgICAgICAgZmlsZXM9Ii4rW1xcXC9dRGVmYXVsdEh0dHBQcm92aWRlck1hcnNoYWxlclwuamF2YSIKLSAgICAgICAgICAgICAgbGluZXM9IjE3MSIvPgotPC9zdXBwcmVzc2lvbnM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtY2hlY2tzdHlsZS54bWwgYi9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtY2hlY2tzdHlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDcyNDQuLjAwMDAwMDAKLS0tIGEvc2VydmljZW1peC1idWlsZC9zcmMvbWFpbi9yZXNvdXJjZXMvc214LWNoZWNrc3R5bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjIvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzIuZHRkIj4KLQotPCEtLQotQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgY29kZSBtZWV0cyB0aGUgQ1hGIGNvZGluZyBndWlkZWxpbmVzIHdoaWNoIAotYXJlIHNpbWlsYXIgdG8gdGhlIFN1biBndWlkZWxpbmVzIGF0OgotaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252L2luZGV4Lmh0bWwKLQotSXQgYWxzbyBlbmZvcmNlcyBhYSBidW5jaCBvZiBvdGhlciAiQmVzdFByYWN0aWNlcyBsaWtlIG1ldGhvZAotbGVuZ3RocywgaWYvdHJ5IGRlcHRocywgZXRjLi4uCi0tLT4KLQotPG1vZHVsZSBuYW1lPSJDaGVja2VyIj4KLSAgICA8IS0tIENoZWNrcyB3aGV0aGVyIGZpbGVzIGVuZCB3aXRoIGEgbmV3IGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwjTmV3bGluZUF0RW5kT2ZGaWxlIC0tPgotICAgIDwhLS0KLSAgICA8bW9kdWxlIG5hbWU9Ik5ld2xpbmVBdEVuZE9mRmlsZSIvPgotICAgIC0tPgotCi0gICAgPCEtLSBDaGVja3MgdGhhdCBwcm9wZXJ0eSBmaWxlcyBjb250YWluIHRoZSBzYW1lIGtleXMuICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwjVHJhbnNsYXRpb24gLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvPgotCi0gICAgPCEtLTxtb2R1bGUgbmFtZT0iU3RyaWN0RHVwbGljYXRlQ29kZSIvPi0tPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgSmF2YWRvYyBjb21tZW50cy4gICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlSHRtbCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NNZXRob2QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVHlwZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NTdHlsZSIvPgotICAgICAgICAtLT4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBOYW1pbmcgQ29udmVudGlvbnMuICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbmFtaW5nLmh0bWwgLS0+ICAgICAgCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ29uc3RhbnROYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxGaW5hbFZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWVtYmVyTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdGF0aWNWYXJpYWJsZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlTmFtZSIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBIZWFkZXIgY2hlY2tzIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cEhlYWRlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyRmlsZSIKLSAgICAgICAgICAgICAgICAgdmFsdWU9IiR7Y2hlY2tzdHlsZS5oZWFkZXIuZmlsZX0iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgaW1wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2ltcG9ydC5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZXhjbHVkZXMiIHZhbHVlPSJqYXZhLmlvLGphdmEudXRpbCxqYXZhLm5ldCxqYXZhLm5pbyxqYXZhLm5pby5jaGFubmVscyxqYXZhLmxhbmcucmVmbGVjdCxvcmcudzNjLmRvbSxvcmcueG1sLnNheCxqYXZhLmF3dCxqYXZheC5zd2luZyxqdW5pdC5mcmFtZXdvcmsiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbEltcG9ydCIvPiA8IS0tIGRlZmF1bHRzIHRvIHN1bi4qIHBhY2thZ2VzIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbXBvcnRPcmRlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZ3JvdXBzIiB2YWx1ZT0iamF2YSxqYXZheCxvcmcudzNjLG9yZy54bWwsanVuaXQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPCEtLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkltcG9ydENvbnRyb2wiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZpbGUiIHZhbHVlPSJldGMvaW1wb3J0LWNvbnRyb2wueG1sIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICAtLT4KLSAgICAgICAgCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIFNpemUgVmlvbGF0aW9ucy4gICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3NpemVzLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQW5vbklubmVyTGVuZ3RoIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSI0MCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFeGVjdXRhYmxlU3RhdGVtZW50Q291bnQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9Ijc1Ii8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkZpbGVMZW5ndGgiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjMwMDAiLz4KLQk8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMaW5lTGVuZ3RoIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxNDAiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTGVuZ3RoIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxNTAiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3VudEVtcHR5IiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTnVtYmVyIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSI3Ii8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciB3aGl0ZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3doaXRlc3BhY2UuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eUZvckl0ZXJhdG9yUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlGb3JJbml0aWFsaXplclBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZFBhcmFtUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQWZ0ZXIiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkFSUkFZX0lOSVQsQk5PVCxERUMsRE9ULElOQyxMTk9ULFVOQVJZX01JTlVTLFVOQVJZX1BMVVMiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQmVmb3JlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iT3BlcmF0b3JXcmFwIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyZW5QYWQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlY2FzdFBhcmVuUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVGFiQ2hhcmFjdGVyIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFmdGVyIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJDT01NQSwgU0VNSSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJXaGl0ZXNwYWNlQXJvdW5kIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJBU1NJR04sIEJBTkQsIEJBTkRfQVNTSUdOLCBCT1IsIEJPUl9BU1NJR04sIEJTUiwgQlNSX0FTU0lHTiwgQlhPUiwgQlhPUl9BU1NJR04sIENPTE9OLCBESVYsIERJVl9BU1NJR04sIEVRVUFMLCBHRSwgR1QsIExBTkQsIExDVVJMWSwgTEUsIExJVEVSQUxfQVNTRVJULCBMSVRFUkFMX0NBVENILCBMSVRFUkFMX0RPLCBMSVRFUkFMX0VMU0UsIExJVEVSQUxfRklOQUxMWSwgTElURVJBTF9GT1IsIExJVEVSQUxfSUYsIExJVEVSQUxfUkVUVVJOLCBMSVRFUkFMX1NZTkNIUk9OSVpFRCwgTElURVJBTF9UUlksIExJVEVSQUxfV0hJTEUsIExPUiwgTFQsIE1JTlVTLCBNSU5VU19BU1NJR04sIE1PRCwgTU9EX0FTU0lHTiwgTk9UX0VRVUFMLCBQTFVTLCBQTFVTX0FTU0lHTiwgUVVFU1RJT04sIFJDVVJMWSwgU0wsIFNMSVNULCBTTF9BU1NJR04sIFNSLCBTUl9BU1NJR04sIFNUQVIsIFNUQVJfQVNTSUdOLFRZUEVfRVhURU5TSU9OX0FORCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgIAotCi0gICAgICAgIDwhLS0gTW9kaWZpZXIgQ2hlY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbW9kaWZpZXJzLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgYmxvY2tzLiBZb3Uga25vdywgdGhvc2Uge30ncyAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Jsb2Nrcy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkTmVzdGVkQmxvY2tzIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd0luU3dpdGNoQ2FzZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlCbG9jayI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0idGV4dCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOZWVkQnJhY2VzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSIvPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNvbW1vbiBjb2RpbmcgcHJvYmxlbXMgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19jb2RpbmcuaHRtbCAtLT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iQXJyYXlUcmFpbGluZ0NvbW1hIi8+LS0+Ci0gICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IkF2b2lkSW5saW5lQ29uZGl0aW9uYWxzIi8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ292YXJpYW50RXF1YWxzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRG91YmxlQ2hlY2tlZExvY2tpbmciLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVxdWFsc0hhc2hDb2RlIi8+Ci0gICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IkZpbmFsTG9jYWxWYXJpYWJsZSIvPi0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb25zdHJ1Y3RvclBhcmFtZXRlciIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVTZXR0ZXIiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbnN0YW50aWF0aW9uIi8+Ci0gICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IklsbGVnYWxUb2tlbiIvPi0tPgotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJJbGxlZ2FsVG9rZW5UZXh0Ii8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW5uZXJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDwhLS08bW9kdWxlIG5hbWU9Ik1hZ2ljTnVtYmVyIi8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWlzc2luZ1N3aXRjaERlZmF1bHQiLz4KLSAgICAgICAgPCEtLW1vZHVsZSBuYW1lPSJNb2RpZmllZENvbnRyb2xWYXJpYWJsZSIvLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuRXhwcmVzc2lvbiIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlNpbXBsaWZ5Qm9vbGVhblJldHVybiIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN0cmluZ0xpdGVyYWxFcXVhbGl0eSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik5lc3RlZElmRGVwdGgiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjMiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTmVzdGVkVHJ5RGVwdGgiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjMiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3VwZXJDbG9uZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN1cGVyRmluYWxpemUiLz4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iSWxsZWdhbENhdGNoIi8+LS0+Ci0JPG1vZHVsZSBuYW1lPSJJbGxlZ2FsVGhyb3dzIj4KLQkgIDxwcm9wZXJ0eSBuYW1lPSJpbGxlZ2FsQ2xhc3NOYW1lcyIgdmFsdWU9ImphdmEubGFuZy5FcnJvcixqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIvPgotCTwvbW9kdWxlPgotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRUaHJvd3MiLz4tLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKVW5pdFRlc3RDYXNlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmV0dXJuQ291bnQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjYiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIAotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxUeXBlIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeeHh4JCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImlsbGVnYWxDbGFzc05hbWVzIiB2YWx1ZT0iamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyLCBqYXZhLnV0aWwuSGFzaHRhYmxlLCBqYXZhLnV0aWwuSGFzaFNldCwgamF2YS51dGlsLkhhc2hNYXAsIGphdmEudXRpbC5BcnJheUxpc3QsIGphdmEudXRpbC5MaW5rZWRMaXN0LCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCwgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQsIGphdmEudXRpbC5UcmVlU2V0LCBqYXZhLnV0aWwuVHJlZU1hcCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJEZWNsYXJhdGlvbk9yZGVyIi8+Ci0gICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IlBhcmFtZXRlckFzc2lnbm1lbnQiLz4tLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFeHBsaWNpdEluaXRpYWxpemF0aW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRGVmYXVsdENvbWVzTGFzdCIvPgotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJNaXNzaW5nQ3RvciIvPi0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkZhbGxUaHJvdWdoIi8+Ci0gICAgICAgIDwhLS08bW9kdWxlIG5hbWU9Ik11bHRpcGxlU3RyaW5nTGl0ZXJhbHMiLz4tLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zIi8+Ci0gICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IlJlcXVpcmVUaGlzIi8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVW5uZWNlc3NhcnlQYXJlbnRoZXNlcyIvPgotICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNsYXNzIGRlc2lnbiAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kZXNpZ24uaHRtbCAtLT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iRGVzaWduRm9yRXh0ZW5zaW9uIi8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmluYWxDbGFzcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik11dGFibGVFeGNlcHRpb24iLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUaHJvd3NDb3VudCI+Ci0gICAgICAgIAk8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iNSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJWaXNpYmlsaXR5TW9kaWZpZXIiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3RlY3RlZEFsbG93ZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFja2FnZUFsbG93ZWQiIHZhbHVlPSJ0cnVlIi8+Ci0JCQk8IS0tIHRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcmVzb3VyY2UgaW5qZWN0aW9uIHVuaXQgdGVzdHMuICBJdCB3aWxsIHJlbW92ZWQgCi0JCQkgICAgIHdoZW4gcHJpdmF0ZSBtZW1iZXIgaW5qZWN0IGlzIHN1cHBvcnRlZC4KLQkJCS0tPgotICAgIAkJPHByb3BlcnR5IG5hbWU9InB1YmxpY01lbWJlclBhdHRlcm4iIHZhbHVlPSJyZXNvdXJjZVsxMl0uKiIvPgotICAgICAgICA8L21vZHVsZT4KLQotCi0KLSAgICAgICAgPCEtLSBNZXRyaWNzIGNoZWNrcy4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWV0cmljcy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkJvb2xlYW5FeHByZXNzaW9uQ29tcGxleGl0eSI+Ci0gICAgICAgIAk8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iNiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iQ2xhc3NEYXRhQWJzdHJhY3Rpb25Db3VwbGluZyIvPi0tPgotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJDbGFzc0Zhbk91dENvbXBsZXhpdHkiLz4tLT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iQ3ljbG9tYXRpY0NvbXBsZXhpdHkiLz4tLT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iTlBhdGhDb21wbGV4aXR5Ii8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YU5DU1MiPgotICAgICAgIAkJPHByb3BlcnR5IG5hbWU9Im1ldGhvZE1heGltdW0iIHZhbHVlPSI3NSIvPgotICAgICAgICA8L21vZHVsZT4KLQotCQkKLSAgICAgICAgPCEtLSBNaXNjZWxsYW5lb3VzIG90aGVyIGNoZWNrcy4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sIC0tPgotICAgICAgICA8IS0tIAotICAgICAgICA8bW9kdWxlIG5hbWU9IkFycmF5VHlwZVN0eWxlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8+Ci0gICAgICAgIC0tPgotICAgICAgICA8IS0tCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlxzKyQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iTGluZSBoYXMgdHJhaWxpbmcgc3BhY2VzLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVG9kb0NvbW1lbnQiPgotCQkJPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IldBUk5JTkciLz4KLQkJPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgotICAgICAgICAKLSAgICAgICAgPCEtLUFzc2VydCBzdGF0ZW1lbnQgbWF5IGhhdmUgc2lkZSBlZmZlY3RzOi0tPgotCQk8bW9kdWxlIG5hbWU9IkRlc2NlbmRhbnRUb2tlbiI+Ci0gICAgCQk8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iTElURVJBTF9BU1NFUlQiLz4KLQkJICAgIDxwcm9wZXJ0eSBuYW1lPSJsaW1pdGVkVG9rZW5zIiB2YWx1ZT0iQVNTSUdOLERFQyxJTkMsUE9TVF9ERUMsUE9TVF9JTkMsUExVU19BU1NJR04sTUlOVVNfQVNTSUdOLFNUQVJfQVNTSUdOLERJVl9BU1NJR04sTU9EX0FTU0lHTixCU1JfQVNTSUdOLFNSX0FTU0lHTixTTF9BU1NJR04sQkFORF9BU1NJR04sQlhPUl9BU1NJR04sQk9SX0FTU0lHTiIvPgotCQkgICAgPHByb3BlcnR5IG5hbWU9Im1heGltdW1OdW1iZXIiIHZhbHVlPSIwIi8+Ci0JCTwvbW9kdWxlPgotIAotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJVbmNvbW1lbnRlZE1haW4iLz4tLT4KLSAgICAgICAgPCEtLW1vZHVsZSBuYW1lPSJUcmFpbGluZ0NvbW1lbnQiLy0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkluZGVudGF0aW9uIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXNlSW5kZW50IiB2YWx1ZT0iMCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iUmVxdWlyZWRSZWdleHAiPi0tPgotICAgIDwvbW9kdWxlPgotCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VtaXgtYnVpbGQvc3JjL21haW4vcmVzb3VyY2VzL3NteC1lY2xpcHNlLWNoZWNrc3R5bGUgYi9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtZWNsaXBzZS1jaGVja3N0eWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzk2ZTA5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VtaXgtYnVpbGQvc3JjL21haW4vcmVzb3VyY2VzL3NteC1lY2xpcHNlLWNoZWNrc3R5bGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmlsZXNldC1jb25maWcgZmlsZS1mb3JtYXQtdmVyc2lvbj0iMS4xLjAiIHNpbXBsZS1jb25maWc9ImZhbHNlIj4KLSAgICA8ZmlsZXNldCBuYW1lPSJhbGwiIGVuYWJsZWQ9InRydWUiIGNoZWNrLWNvbmZpZy1uYW1lPSJDWEYgQ2hlY2tzIiB0eXBlPSJleHRlcm5hbCIgZGVzY3JpcHRpb249IiI+Ci0gICAgICAgIDxmaWxlLW1hdGNoLXBhdHRlcm4gbWF0Y2gtcGF0dGVybj0iXnNyY1svXFxdLiIgaW5jbHVkZS1wYXR0ZXJuPSJ0cnVlIi8+Ci0gICAgICAgIDxmaWxlLW1hdGNoLXBhdHRlcm4gbWF0Y2gtcGF0dGVybj0iXnNyY1svXFxdbWFpblsvXFxdZ2VuZXJhdGVkWy9cXF0uIiBpbmNsdWRlLXBhdHRlcm49ImZhbHNlIi8+Ci0gICAgICAgIDxmaWxlLW1hdGNoLXBhdHRlcm4gbWF0Y2gtcGF0dGVybj0iXnNyY1svXFxddGVzdFsvXFxdZ2VuZXJhdGVkWy9cXF0uIiBpbmNsdWRlLXBhdHRlcm49ImZhbHNlIi8+Ci0gICAgPC9maWxlc2V0PgotPC9maWxlc2V0LWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtZWNsaXBzZS1jb2RlLWNvbnZlbnRpb25zLnhtbCBiL3NlcnZpY2VtaXgtYnVpbGQvc3JjL21haW4vcmVzb3VyY2VzL3NteC1lY2xpcHNlLWNvZGUtY29udmVudGlvbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDlkOTMxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VtaXgtYnVpbGQvc3JjL21haW4vcmVzb3VyY2VzL3NteC1lY2xpcHNlLWNvZGUtY29udmVudGlvbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2ZpbGVzIHZlcnNpb249IjEwIj4KLTxwcm9maWxlIG5hbWU9InNteC1lY2xpcHNlLWNvZGUtY29udmVudGlvbnMiIHZlcnNpb249IjEwIj4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnMiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbCIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudCIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbiIgdmFsdWU9IjgwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHMiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcyIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cyIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZSIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucyIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jayIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQiIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWwiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb24iIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGgiIHZhbHVlPSI4MCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWYiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbiIgdmFsdWU9IjIiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjIiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcyIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2siIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keSIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2giIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplIiB2YWx1ZT0iNCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3NpbmciIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2siIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jayIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2UiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2ZvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWYiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2giIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jayIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2giIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2ZvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWYiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0IiB2YWx1ZT0iODAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keSIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXIiIHZhbHVlPSJzcGFjZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemUiIHZhbHVlPSI0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTwvcHJvZmlsZT4KLTwvcHJvZmlsZXM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtZWNsaXBzZS1wbWQgYi9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtZWNsaXBzZS1wbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmQ3YmUuLjAwMDAwMDAKLS0tIGEvc2VydmljZW1peC1idWlsZC9zcmMvbWFpbi9yZXNvdXJjZXMvc214LWVjbGlwc2UtcG1kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHBtZD4KLSAgICA8dXNlUHJvamVjdFJ1bGVTZXQ+dHJ1ZTwvdXNlUHJvamVjdFJ1bGVTZXQ+Ci0gICAgPHJ1bGVzLz4KLTwvcG1kPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VtaXgtYnVpbGQvc3JjL21haW4vcmVzb3VyY2VzL3NteC1wbWQtcnVsZXNldC54bWwgYi9zZXJ2aWNlbWl4LWJ1aWxkL3NyYy9tYWluL3Jlc291cmNlcy9zbXgtcG1kLXJ1bGVzZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWUzYWU1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VtaXgtYnVpbGQvc3JjL21haW4vcmVzb3VyY2VzL3NteC1wbWQtcnVsZXNldC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxydWxlc2V0IG5hbWU9InBtZC1lY2xpcHNlIj4KLSAgICA8ZGVzY3JpcHRpb24+UE1EIFBsdWdpbiBwcmVmZXJlbmNlcyBydWxlIHNldDwvZGVzY3JpcHRpb24+Ci0KLQotICAgIDxydWxlIHJlZj0icnVsZXNldHMvYmFzaWMueG1sL0Jvb2xlYW5JbnN0YW50aWF0aW9uIi8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvQ29sbGFwc2libGVJZlN0YXRlbWVudHMiLz4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Jhc2ljLnhtbC9Eb3VibGVDaGVja2VkTG9ja2luZyIvPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Jhc2ljLnhtbC9FbXB0eUNhdGNoQmxvY2siLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvRW1wdHlGaW5hbGx5QmxvY2siLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvRW1wdHlJZlN0bXQiLz4tLT4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Jhc2ljLnhtbC9FbXB0eVN0YXRlbWVudE5vdEluTG9vcCIvPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Jhc2ljLnhtbC9FbXB0eVN0YXRpY0luaXRpYWxpemVyIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvYmFzaWMueG1sL0VtcHR5U3dpdGNoU3RhdGVtZW50cyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Jhc2ljLnhtbC9FbXB0eVN5bmNocm9uaXplZEJsb2NrIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvYmFzaWMueG1sL0VtcHR5VHJ5QmxvY2siLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvRW1wdHlXaGlsZVN0bXQiLz4tLT4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Jhc2ljLnhtbC9Gb3JMb29wU2hvdWxkQmVXaGlsZUxvb3AiLz4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Jhc2ljLnhtbC9KdW1ibGVkSW5jcmVtZW50ZXIiLz4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvT3ZlcnJpZGVCb3RoRXF1YWxzQW5kSGFzaGNvZGUiLz4tLT4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Jhc2ljLnhtbC9SZXR1cm5Gcm9tRmluYWxseUJsb2NrIi8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvVW5jb25kaXRpb25hbElmU3RhdGVtZW50Ii8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvVW5uZWNlc3NhcnlDb252ZXJzaW9uVGVtcG9yYXJ5Ii8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvVW5uZWNlc3NhcnlGaW5hbE1vZGlmaWVyIi8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvVW5uZWNlc3NhcnlSZXR1cm4iLz4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9iYXNpYy54bWwvVXNlbGVzc092ZXJyaWRpbmdNZXRob2QiLz4tLT4KLQotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2JyYWNlcy54bWwvRm9yTG9vcHNNdXN0VXNlQnJhY2VzIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvYnJhY2VzLnhtbC9JZkVsc2VTdG10c011c3RVc2VCcmFjZXMiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9icmFjZXMueG1sL0lmU3RtdHNNdXN0VXNlQnJhY2VzIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvYnJhY2VzLnhtbC9XaGlsZUxvb3BzTXVzdFVzZUJyYWNlcyIvPi0tPgotCi0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvY2xvbmUueG1sL0Nsb25lTWV0aG9kTXVzdEltcGxlbWVudENsb25lYWJsZSIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Nsb25lLnhtbC9DbG9uZVRocm93c0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvY2xvbmUueG1sL1Byb3BlckNsb25lSW1wbGVtZW50YXRpb24iLz4tLT4KLQotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvZGVzaXplLnhtbC9DeWNsb21hdGljQ29tcGxleGl0eSIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvZGVzaXplLnhtbC9FeGNlc3NpdmVDbGFzc0xlbmd0aCIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvZGVzaXplLnhtbC9FeGNlc3NpdmVNZXRob2RMZW5ndGgiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9jb2Rlc2l6ZS54bWwvRXhjZXNzaXZlUGFyYW1ldGVyTGlzdCIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvZGVzaXplLnhtbC9FeGNlc3NpdmVQdWJsaWNDb3VudCIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvZGVzaXplLnhtbC9Ub29NYW55RmllbGRzIi8+LS0+Ci0KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2NvbnRyb3ZlcnNpYWwueG1sL0Fzc2lnbm1lbnRJbk9wZXJhbmQiLz4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9jb250cm92ZXJzaWFsLnhtbC9BdExlYXN0T25lQ29uc3RydWN0b3IiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9jb250cm92ZXJzaWFsLnhtbC9DYWxsU3VwZXJJbkNvbnN0cnVjdG9yIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvY29udHJvdmVyc2lhbC54bWwvRG9udEltcG9ydFN1biIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvbnRyb3ZlcnNpYWwueG1sL051bGxBc3NpZ25tZW50Ii8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvY29udHJvdmVyc2lhbC54bWwvT25seU9uZVJldHVybiIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvbnRyb3ZlcnNpYWwueG1sL1Npbmd1bGFyRmllbGQiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9jb250cm92ZXJzaWFsLnhtbC9TdXNwaWNpb3VzT2N0YWxFc2NhcGUiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9jb250cm92ZXJzaWFsLnhtbC9Vbm5lY2Vzc2FyeUNvbnN0cnVjdG9yIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvY29udHJvdmVyc2lhbC54bWwvVW5uZWNlc3NhcnlQYXJlbnRoZXNlcyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvbnRyb3ZlcnNpYWwueG1sL1VudXNlZE1vZGlmaWVyIi8+LS0+Ci0KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9jb3VwbGluZy54bWwvQ291cGxpbmdCZXR3ZWVuT2JqZWN0cyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2NvdXBsaW5nLnhtbC9FeGNlc3NpdmVJbXBvcnRzIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvY291cGxpbmcueG1sL0xvb3NlQ291cGxpbmciLz4tLT4KLQotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvQWJzdHJhY3RDbGFzc1dpdGhvdXRBYnN0cmFjdE1ldGhvZCIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvQWNjZXNzb3JDbGFzc0dlbmVyYXRpb24iLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL0Fzc2lnbm1lbnRUb05vbkZpbmFsU3RhdGljIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9Bdm9pZERlZXBseU5lc3RlZElmU3RtdHMiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL0F2b2lkSW5zdGFuY2VvZkNoZWNrc0luQ2F0Y2hDbGF1c2UiLz4tLT4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvQXZvaWRQcm90ZWN0ZWRGaWVsZEluRmluYWxDbGFzcyIvPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvQXZvaWRSZWFzc2lnbmluZ1BhcmFtZXRlcnMiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL0F2b2lkU3luY2hyb25pemVkQXRNZXRob2RMZXZlbCIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvQmFkQ29tcGFyaXNvbiIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvQ2xvc2VDb25uZWN0aW9uIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9Db21wYXJlT2JqZWN0c1dpdGhFcXVhbHMiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL0NvbmZ1c2luZ1Rlcm5hcnkiLz4tLT4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvQ29uc3RydWN0b3JDYWxsc092ZXJyaWRhYmxlTWV0aG9kIi8+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9EZWZhdWx0TGFiZWxOb3RMYXN0SW5Td2l0Y2hTdG10Ii8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9GaW5hbEZpZWxkQ291bGRCZVN0YXRpYyIvPi0tPgotICAgIDxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9JZGVtcG90ZW50T3BlcmF0aW9ucyIvPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvSW1tdXRhYmxlRmllbGQiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL0luc3RhbnRpYXRpb25Ub0dldENsYXNzIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9NaXNzaW5nQnJlYWtJblN3aXRjaCIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvTWlzc2luZ1N0YXRpY01ldGhvZEluTm9uSW5zdGFudGlhdGFibGVDbGFzcyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvTm9uQ2FzZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnQiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL05vblN0YXRpY0luaXRpYWxpemVyIi8+LS0+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL09wdGltaXphYmxlVG9BcnJheUNhbGwiLz4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvUG9zaXRpb25MaXRlcmFsc0ZpcnN0SW5Db21wYXJpc29ucyIvPgotICAgIDxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9TaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9ucyIvPgotICAgIDxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9TaW1wbGlmeUJvb2xlYW5SZXR1cm5zIi8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL1NpbXBsaWZ5Q29uZGl0aW9uYWwiLz4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL1N3aXRjaERlbnNpdHkiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9kZXNpZ24ueG1sL1N3aXRjaFN0bXRzU2hvdWxkSGF2ZURlZmF1bHQiLz4tLT4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvVW5uZWNlc3NhcnlMb2NhbEJlZm9yZVJldHVybiIvPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvVXNlTG9jYWxlV2l0aENhc2VDb252ZXJzaW9ucyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2Rlc2lnbi54bWwvVXNlTm90aWZ5QWxsSW5zdGVhZE9mTm90aWZ5Ii8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZGVzaWduLnhtbC9Vc2VTaW5nbGV0b24iLz4tLT4KLQotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2ZpbmFsaXplcnMueG1sL0VtcHR5RmluYWxpemVyIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZmluYWxpemVycy54bWwvRmluYWxpemVPbmx5Q2FsbHNTdXBlckZpbmFsaXplIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZmluYWxpemVycy54bWwvRmluYWxpemVPdmVybG9hZGVkIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZmluYWxpemVycy54bWwvRmluYWxpemVEb2VzTm90Q2FsbFN1cGVyRmluYWxpemUiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9maW5hbGl6ZXJzLnhtbC9GaW5hbGl6ZVNob3VsZEJlUHJvdGVjdGVkIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvZmluYWxpemVycy54bWwvQXZvaWRDYWxsaW5nRmluYWxpemUiLz4tLT4KLQotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2ltcG9ydHMueG1sL0R1cGxpY2F0ZUltcG9ydHMiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9pbXBvcnRzLnhtbC9Eb250SW1wb3J0SmF2YUxhbmciLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9pbXBvcnRzLnhtbC9VbnVzZWRJbXBvcnRzIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvaW1wb3J0cy54bWwvSW1wb3J0RnJvbVNhbWVQYWNrYWdlIi8+LS0+Ci0KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9qYXZhYmVhbnMueG1sL0JlYW5NZW1iZXJzU2hvdWxkU2VyaWFsaXplIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvamF2YWJlYW5zLnhtbC9NaXNzaW5nU2VyaWFsVmVyc2lvblVJRCIvPi0tPgotCi0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvanVuaXQueG1sL0pVbml0U3RhdGljU3VpdGUiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9qdW5pdC54bWwvSlVuaXRTcGVsbGluZyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2p1bml0LnhtbC9KVW5pdEFzc2VydGlvbnNTaG91bGRJbmNsdWRlTWVzc2FnZSIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2p1bml0LnhtbC9KVW5pdFRlc3RzU2hvdWxkSW5jbHVkZUFzc2VydCIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2p1bml0LnhtbC9UZXN0Q2xhc3NXaXRob3V0VGVzdENhc2VzIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvanVuaXQueG1sL1VubmVjZXNzYXJ5Qm9vbGVhbkFzc2VydGlvbiIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2p1bml0LnhtbC9Vc2VBc3NlcnRFcXVhbHNJbnN0ZWFkT2ZBc3NlcnRUcnVlIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvanVuaXQueG1sL1VzZUFzc2VydFNhbWVJbnN0ZWFkT2ZBc3NlcnRUcnVlIi8+LS0+Ci0KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9sb2dnaW5nLWphdmEueG1sL0F2b2lkUHJpbnRTdGFja1RyYWNlIi8+LS0+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9sb2dnaW5nLWphdmEueG1sL0xvZ2dlcklzTm90U3RhdGljRmluYWwiLz4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9sb2dnaW5nLWphdmEueG1sL01vcmVUaGFuT25lTG9nZ2VyIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvbG9nZ2luZy1qYXZhLnhtbC9Mb2dnZXJJc05vdFN0YXRpY0ZpbmFsIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvbG9nZ2luZy1qYXZhLnhtbC9Mb2dCbG9ja1dpdGhvdXRJZiIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2xvZ2dpbmctamF2YS54bWwvU3lzdGVtUHJpbnRsbiIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2xvZ2dpbmctamFrYXJ0YS1jb21tb25zLnhtbC9Vc2VDb3JyZWN0RXhjZXB0aW9uTG9nZ2luZyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL2xvZ2dpbmctamFrYXJ0YS1jb21tb25zLnhtbC9Qcm9wZXJMb2dnZXIiLz4tLT4KLQotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL25hbWluZy54bWwvU2hvcnRWYXJpYWJsZSIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL25hbWluZy54bWwvTG9uZ1ZhcmlhYmxlIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvbmFtaW5nLnhtbC9TaG9ydE1ldGhvZE5hbWUiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9uYW1pbmcueG1sL1ZhcmlhYmxlTmFtaW5nQ29udmVudGlvbnMiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9uYW1pbmcueG1sL01ldGhvZE5hbWluZ0NvbnZlbnRpb25zIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvbmFtaW5nLnhtbC9DbGFzc05hbWluZ0NvbnZlbnRpb25zIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvbmFtaW5nLnhtbC9BYnN0cmFjdE5hbWluZyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL25hbWluZy54bWwvQXZvaWREb2xsYXJTaWducyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL25hbWluZy54bWwvTWV0aG9kV2l0aFNhbWVOYW1lQXNFbmNsb3NpbmdDbGFzcyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL25hbWluZy54bWwvU3VzcGljaW91c0hhc2hjb2RlTWV0aG9kTmFtZSIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL25hbWluZy54bWwvU3VzcGljaW91c0NvbnN0YW50RmllbGROYW1lIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvbmFtaW5nLnhtbC9Bdm9pZEZpZWxkTmFtZU1hdGNoaW5nVHlwZU5hbWUiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9uYW1pbmcueG1sL0F2b2lkRmllbGROYW1lTWF0Y2hpbmdNZXRob2ROYW1lIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvbmFtaW5nLnhtbC9Bdm9pZE5vbkNvbnN0cnVjdG9yTWV0aG9kc1dpdGhDbGFzc05hbWUiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9uYW1pbmcueG1sL05vUGFja2FnZSIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL25hbWluZy54bWwvUGFja2FnZUNhc2UiLz4tLT4KLQotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL29wdGltaXphdGlvbnMueG1sL0xvY2FsVmFyaWFibGVDb3VsZEJlRmluYWwiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9vcHRpbWl6YXRpb25zLnhtbC9NZXRob2RBcmd1bWVudENvdWxkQmVGaW5hbCIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL29wdGltaXphdGlvbnMueG1sL0F2b2lkSW5zdGFudGlhdGluZ09iamVjdHNJbkxvb3BzIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvb3B0aW1pemF0aW9ucy54bWwvVXNlQXJyYXlMaXN0SW5zdGVhZE9mVmVjdG9yIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvb3B0aW1pemF0aW9ucy54bWwvU2ltcGxpZnlTdGFydHNXaXRoIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvb3B0aW1pemF0aW9ucy54bWwvVXNlU3RyaW5nQnVmZmVyRm9yU3RyaW5nQXBwZW5kcyIvPi0tPgotCi0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvc3RyaWN0ZXhjZXB0aW9uLnhtbC9Bdm9pZENhdGNoaW5nVGhyb3dhYmxlIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvc3RyaWN0ZXhjZXB0aW9uLnhtbC9TaWduYXR1cmVEZWNsYXJlVGhyb3dzRXhjZXB0aW9uIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvc3RyaWN0ZXhjZXB0aW9uLnhtbC9FeGNlcHRpb25Bc0Zsb3dDb250cm9sIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvc3RyaWN0ZXhjZXB0aW9uLnhtbC9Bdm9pZENhdGNoaW5nTlBFIi8+LS0+Ci0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvc3RyaWN0ZXhjZXB0aW9uLnhtbC9Bdm9pZFRocm93aW5nUmF3RXhjZXB0aW9uVHlwZXMiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9zdHJpY3RleGNlcHRpb24ueG1sL0F2b2lkVGhyb3dpbmdOdWxsUG9pbnRlckV4Y2VwdGlvbiIvPi0tPgotCi0gICAgPCEtLTxydWxlIHJlZj0icnVsZXNldHMvc3RyaW5ncy54bWwvQXZvaWREdXBsaWNhdGVMaXRlcmFscyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL3N0cmluZ3MueG1sL1N0cmluZ0luc3RhbnRpYXRpb24iLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9zdHJpbmdzLnhtbC9TdHJpbmdUb1N0cmluZyIvPi0tPgotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL3N0cmluZ3MueG1sL0F2b2lkQ29uY2F0ZW5hdGluZ05vbkxpdGVyYWxzSW5TdHJpbmdCdWZmZXIiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9zdHJpbmdzLnhtbC9Vbm5lY2Vzc2FyeUNhc2VDaGFuZ2UiLz4tLT4KLQotICAgIDwhLS08cnVsZSByZWY9InJ1bGVzZXRzL3N1bnNlY3VyZS54bWwvTWV0aG9kUmV0dXJuc0ludGVybmFsQXJyYXkiLz4tLT4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy9zdW5zZWN1cmUueG1sL0FycmF5SXNTdG9yZWREaXJlY3RseSIvPi0tPgotCi0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy91bnVzZWRjb2RlLnhtbC9VbnVzZWRMb2NhbFZhcmlhYmxlIi8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy91bnVzZWRjb2RlLnhtbC9VbnVzZWRQcml2YXRlRmllbGQiLz4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL3VudXNlZGNvZGUueG1sL1VudXNlZFByaXZhdGVNZXRob2QiLz4KLSAgICA8IS0tPHJ1bGUgcmVmPSJydWxlc2V0cy91bnVzZWRjb2RlLnhtbC9VbnVzZWRGb3JtYWxQYXJhbWV0ZXIiLz4tLT4KLQotPC9ydWxlc2V0PgpkaWZmIC0tZ2l0IGEvdGFyZ2V0Ly5wbHhhcmMgYi90YXJnZXQvLnBseGFyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VhNmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0Ly5wbHhhcmMKQEAgLTAsMCArMSBAQAorbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORi9ERVBFTkRFTkNJRVMgYi90YXJnZXQvbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GL0RFUEVOREVOQ0lFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRlM2RkCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORi9ERVBFTkRFTkNJRVMKQEAgLTAsMCArMSwxMSBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2l0aXZlIGRlcGVuZGVuY2llcyBvZiB0aGlzIHByb2plY3QgZGV0ZXJtaW5lZCBmcm9tIHRoZQorLy8gbWF2ZW4gcG9tIG9yZ2FuaXplZCBieSBvcmdhbml6YXRpb24uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXBhY2hlIFNlcnZpY2VNaXggOjogUGx1Z2lucworCisKKworCisKZGlmZiAtLWdpdCBhL2NoZWNrc3VtLW1hdmVuLXBsdWdpbi9MSUNFTlNFIGIvdGFyZ2V0L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBjaGVja3N1bS1tYXZlbi1wbHVnaW4vTElDRU5TRQpjb3B5IHRvIHRhcmdldC9tYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UgYi90YXJnZXQvbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE0MDViCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKQEAgLTAsMCArMSw4IEBACisKK0FwYWNoZSBTZXJ2aWNlTWl4IDo6IFBsdWdpbnMKK0NvcHlyaWdodCAyMDA1LTIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCisKKwpkaWZmIC0tZ2l0IGEveGZpcmUtbWF2ZW4tcGx1Z2luL0xJQ0VOU0UgYi94ZmlyZS1tYXZlbi1wbHVnaW4vTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS94ZmlyZS1tYXZlbi1wbHVnaW4vTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS94ZmlyZS1tYXZlbi1wbHVnaW4vTk9USUNFIGIveGZpcmUtbWF2ZW4tcGx1Z2luL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyMTJjNC4uMDAwMDAwMAotLS0gYS94ZmlyZS1tYXZlbi1wbHVnaW4vTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICA9PSAgTk9USUNFIGZpbGUgZm9yIHVzZSB3aXRoIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgID09Ci0gICA9PSAgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIFNlcnZpY2VNaXggZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgID09Ci0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFRoaXMgcHJvZHVjdCBjb250YWlucyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQpkaWZmIC0tZ2l0IGEveGZpcmUtbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi94ZmlyZS1tYXZlbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhMzdmMi4uMDAwMDAwMAotLS0gYS94ZmlyZS1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci08IS0tCi0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2lucy1wb208L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MzwvdmVyc2lvbj4KLSAgICA8cmVsYXRpdmVQYXRoPi4uL21hdmVuLXBsdWdpbnMtcG9tL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4gICAgCi0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zZXJ2aWNlbWl4LnRvb2xpbmc8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnhmaXJlLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+NC4zLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4gIAotICA8bmFtZT5BcGFjaGUgU2VydmljZU1peCA6OiBQbHVnaW5zIDo6IE1hdmVuMiBYRmlyZSBQbHVnaW48L25hbWU+Ci0gIAotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9zZXJ2aWNlbWl4L21hdmVuLXBsdWdpbnMveGZpcmUtbWF2ZW4tcGx1Z2luL3RydW5rPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvc2VydmljZW1peC9tYXZlbi1wbHVnaW5zL3hmaXJlLW1hdmVuLXBsdWdpbi90cnVuazwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9zZXJ2aWNlbWl4L21hdmVuLXBsdWdpbnMveGZpcmUtbWF2ZW4tcGx1Z2luL3RydW5rPC91cmw+Ci0gIDwvc2NtPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjk8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuOTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuNS41PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zY3JpcHQtYW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjk8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnhmaXJlPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+eGZpcmUtZ2VuZXJhdG9yPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4yLjU8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnhmaXJlPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+eGZpcmUtamF4d3M8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuNTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPCEtLSB0aGlzIHRvIHNvbHZlIGEgcG90ZW50aWFsIGlzc3VlIHdpdGggY2xhc3MgbG9hZGVycyAtLT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuMTQ8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjEuNjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+amF4Yi14amM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjEuNjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxyZXBvc2l0b3JpZXM+Ci0gICAgPCEtLQotICAgIDxyZXBvc2l0b3J5PgotICAgICAgICA8aWQ+c2VydmljZW1peC1tMi1yZXBvPC9pZD4KLSAgICAgICAgPG5hbWU+U2VydmljZW1peCBNYXZlbjIgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NlcnZpY2VtaXgvbTItcmVwby88L3VybD4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gIC0tPgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzE8L3VybD4KLSAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgPC9yZXBvc2l0b3J5PgotICA8L3JlcG9zaXRvcmllcz4KLSAgPHByb2ZpbGVzPgotICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gV2Ugd2FudCB0byBkZXBsb3kgdGhlIGFydGlmYWN0IHRvIGEgc3RhZ2luZyBsb2NhdGlvbiBmb3IgcGVydXNhbCAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbHREZXBsb3ltZW50UmVwb3NpdG9yeT4ke2RlcGxveS5hbHRSZXBvc2l0b3J5fTwvYWx0RGVwbG95bWVudFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVwZGF0ZVJlbGVhc2VJbmZvPnRydWU8L3VwZGF0ZVJlbGVhc2VJbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSB3YW50IHRvIHNpZ24gdGhlIGFydGlmYWN0LCB0aGUgUE9NLCBhbmQgYWxsIGF0dGFjaGVkIGFydGlmYWN0cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXNzcGhyYXNlPiR7Z3BnLnBhc3NwaHJhc2V9PC9wYXNzcGhyYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5kZXBsb3k8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxkZWZhdWx0R29hbD5kZXBsb3k8L2RlZmF1bHRHb2FsPgotICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRhY2g+dHJ1ZTwvYXR0YWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0YWNoPnRydWU8L2F0dGFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgPC9wcm9maWxlcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEveGZpcmUtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi94ZmlyZS9Xc2RsZ2VuTW9qby5qYXZhIGIveGZpcmUtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zZXJ2aWNlbWl4L21hdmVuL3BsdWdpbi94ZmlyZS9Xc2RsZ2VuTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzJiZTBhLi4wMDAwMDAwCi0tLSBhL3hmaXJlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4veGZpcmUvV3NkbGdlbk1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuc2VydmljZW1peC5tYXZlbi5wbHVnaW4ueGZpcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS5nZW4uV3NkbEdlblRhc2s7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnhmaXJlLnNwcmluZy5YRmlyZUNvbmZpZ0xvYWRlcjsKLQotLyoqCi0gKiBXc2RsR2VuIG1vam8uCi0gKiA8cC8+Ci0gKiBJbXBsZW1lbnRlZCBhcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBYRmlyZSBXc2RsR2VuIEFudCB0YXNrLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0iamVyb21lQGNvZmZlZWJyZWFrcy5vcmciPkplcm9tZSBMYWNvc3RlPC9hPgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgd3NkbGdlbgotICogQHJlcXVpcmVzUHJvamVjdAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24KLSAqLwotcHVibGljIGNsYXNzIFdzZGxnZW5Nb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiB4ZmlyZSBzZXJ2aWNlLnhtbCBjb25maWcgZmlsZXMKLSAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgbGlzdCB3aWxsIGNvbnRhaW4gYSBzaW5nbGUgdmFsdWUgJ3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZmlyZS9zZXJ2aWNlcy54bWwnCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGNvbmZpZ3M7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IHdpbGwgYmUgYWRkZWQgYXMgUHJvamVjdCdzIFJlc291cmNlLgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtvdXRwdXREaXJlY3Rvcnl9IiBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy94ZmlyZS93c2RsZ2VuIgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYmFzZWRpciBvZiB0aGUgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtiYXNlZGlyfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgYmFzZWRpcjsKLQotICAgIC8qCi0gICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gc3lzdGVtRXJyOwotICAgICBwcml2YXRlIFByaW50U3RyZWFtIHN5c3RlbU91dDsKLSAgICAgcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBteVN5c3RlbUVyciA9IG5ldyBQcmludFN0cmVhbShuZXcgV3NkbGdlbk1vam8uTXlFcnJvclN0cmVhbSgpKTsKLSAgICAgcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBteVN5c3RlbU91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgV3NkbGdlbk1vam8uTXlPdXRwdXRTdHJlYW0oKSk7Ci0KLSAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgIHsKLQotICAgICBzeXN0ZW1FcnIgPSBTeXN0ZW0uZXJyOwotICAgICBzeXN0ZW1PdXQgPSBTeXN0ZW0ub3V0OwotICAgICBTeXN0ZW0uc2V0RXJyKG15U3lzdGVtRXJyKTsKLSAgICAgLy8gU3lzdGVtLnNldE91dChteVN5c3RlbU91dCk7IC8vIGNhdXNlcyBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvcjogSmF2YSBoZWFwIHNwYWNlICBvbiBteSBib3gKLQotICAgICB0cnkgewotICAgICBleGVjKCk7Ci0gICAgIH0gZmluYWxseSB7Ci0gICAgIFN5c3RlbS5zZXRFcnIoIHN5c3RlbUVyciApOwotICAgICAvLyBTeXN0ZW0uc2V0T3V0KCBzeXN0ZW1PdXQgKTsKLSAgICAgfQotICAgICB9Ci0KLSAgICAgY2xhc3MgTXlFcnJvclN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0gICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICBwdWJsaWMgdm9pZCB3cml0ZSggZmluYWwgaW50IGIgKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICBmaW5hbCBjaGFyIGMgPSAoY2hhcikgYjsKLSAgICAgLy8gc2hvdWxkbid0IHdlIGhhbmRsZSAnXHInIGFzIHdlbGwgPz8KLSAgICAgaWYgKGMgPT0gJ1xuJykgewotICAgICBnZXRMb2coKS5lcnJvciggYnVmZmVyICk7Ci0gICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgYnVmZmVyLmFwcGVuZCggYyApOwotICAgICB9Ci0gICAgIH0KLSAgICAgfQotCi0gICAgIGNsYXNzIE15T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLSAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgIHB1YmxpYyB2b2lkIHdyaXRlKCBmaW5hbCBpbnQgYiApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgIGZpbmFsIGNoYXIgYyA9IChjaGFyKSBiOwotICAgICAvLyBzaG91bGRuJ3Qgd2UgaGFuZGxlICdccicgYXMgd2VsbCA/PwotICAgICBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgIGdldExvZygpLmluZm8oIGJ1ZmZlciApOwotICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgIH0gZWxzZSB7Ci0gICAgIGJ1ZmZlci5hcHBlbmQoIGMgKTsKLSAgICAgfQotICAgICB9Ci0gICAgIH0KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGNvbmZpZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb25maWdzCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IEZpbGUoYmFzZWRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hmaXJlL3NlcnZpY2VzLnhtbCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW91dHB1dERpcmVjdG9yeS5leGlzdHMoKSAmJiAhb3V0cHV0RGlyZWN0b3J5Lm1rZGlycygpKSB7Ci0gICAgICAgICAgICBnZXRMb2coKQotICAgICAgICAgICAgICAgICAgICAud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG91dHB1dCBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXREaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IGV4aXN0IGFuZCBjb3VsZG4ndCBiZSBjcmVhdGVkLiBUaGUgZ29hbCB3aXRoIHByb2JhYmx5IGZhaWwuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBQcm9qZWN0IGFudFByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotCi0gICAgICAgIGFudFByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihuZXcgV3NkbGdlbk1vam8uRGVidWdBbnRCdWlsZExpc3RlbmVyKCkpOwotCi0gICAgICAgIC8vIGFkZCBjdXJyZW50IHBvbSBkZXBlbmRlbmNpZXMgdG8gV3NkbEdlblRhc2sgY2xhc3MgbG9hZGVyCi0gICAgICAgIENsYXNzTG9hZGVyIHBhcmVudCA9IFdzZGxHZW5UYXNrLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgVVJMW10gdXJsczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gbCA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0gICAgICAgICAgICBMaXN0IHRoZXVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB0aGV1cmxzLmFkZChuZXcgRmlsZShwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0T3V0cHV0RGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgICAgIC50b1VSTCgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBcnRpZmFjdCBkZXAgPSAoQXJ0aWZhY3QpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICB0aGV1cmxzLmFkZChkZXAuZ2V0RmlsZSgpLnRvVVJMKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXJscyA9IChVUkxbXSkgdGhldXJscy50b0FycmF5KG5ldyBVUkxbdGhldXJscy5zaXplKCldKTsKLQotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoImNsYXNzbG9hZGVyIGNsYXNzcGF0aDogIiArIHRoZXVybHMpOwotCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgVVJMQ2xhc3NMb2FkZXIgY2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscywgcGFyZW50KTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgb2xkQ2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7Ci0KLSAgICAgICAgLy8gZGlzcGxheUNsYXNzcGF0aChjbCwgInVzaW5nIGNsYXNzcGF0aCIpOwotICAgICAgICAvLyBsb2FkKCJqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24iLCBjbCk7Ci0gICAgICAgIC8vIGxvYWQoIm9yZy5jb2RlaGF1cy54ZmlyZS50cmFuc3BvcnQuaHR0cC5YRmlyZVNlcnZsZXRDb250cm9sbGVyIiwgY2wpOwotCi0gICAgICAgIGZpbmFsIFdzZGxHZW5UYXNrIHRhc2sgPSBuZXcgV3NkbEdlblRhc2soKTsKLQotICAgICAgICB0YXNrLnNldFByb2plY3QoYW50UHJvamVjdCk7Ci0KLSAgICAgICAgdGFzay5zZXRPdXRwdXREaXJlY3Rvcnkob3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29uZmlncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29uZmlnVXJsID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAvLyByZXF1aXJlZCBmb3IgbXVsdGktbW9kdWxlcyBwcm9qZWN0cwotICAgICAgICAgICAgaWYgKCFuZXcgRmlsZShjb25maWdVcmwpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybigiY29uZmlnVXJsIG5vdCBmb3VuZC4gVGFzayB3aWxsIHBlcmhhcHMgZmFpbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YXNrLnNldENvbmZpZ1VybChjb25maWdVcmwpOwotCi0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKAotICAgICAgICAgICAgICAgICAgICAiRXhlY3V0aW5nIFhGaXJlIFdzZGxHZW4gdGFzayBmb3IgY29uZmlnVXJsOiAiICsgY29uZmlnVXJsKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0YXNrLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiY29tbWFuZCBleGVjdXRpb24gZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJnZW5lcmF0ZWQgIiArIHRhc2suZ2V0R2VuZXJhdGVkRmlsZSgpKTsKLSAgICAgICAgfQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvbGRDbCk7Ci0KLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkFkZGluZyBvdXRwdXREaXJlY3RvcnkgYXMgUHJvamVjdCdzIHJlc291cmNlLiIpOwotICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOwotICAgICAgICByZXNvdXJjZS5zZXREaXJlY3Rvcnkob3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgdm9pZCBkaXNwbGF5Q2xhc3NwYXRoKFVSTENsYXNzTG9hZGVyIGNsLCBTdHJpbmcgbWVzc2FnZSkKLSAgICAgewotICAgICBVUkxbXSB1cmxzID0gY2wuZ2V0VVJMcygpOwotICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLSAgICAgVVJMIHVyTCA9IHVybHNbaV07Ci0gICAgIGdldExvZygpLmluZm8oIlVSTCAiICsgaSArICI6IiArICB1ckwpOwotICAgICB9Ci0gICAgIH0KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheUNsYXNzcGF0aChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiLS0tLS0tICIgKyBtZXNzYWdlICsgIjoiICsgY2xhc3NMb2FkZXIpOwotICAgICAgICBpZiAoY2xhc3NMb2FkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbGFzc0xvYWRlciBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICBVUkxDbGFzc0xvYWRlciBjbCA9IChVUkxDbGFzc0xvYWRlcikgY2xhc3NMb2FkZXI7Ci0gICAgICAgICAgICBVUkxbXSB1cmxzID0gY2wuZ2V0VVJMcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVVJMIHVyTCA9IHVybHNbaV07Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiVVJMICIgKyBpICsgIjoiICsgdXJMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjbGFzc0xvYWRlciBpbnN0YW5jZW9mIEFudENsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBjbCA9IChBbnRDbGFzc0xvYWRlcikgWEZpcmVDb25maWdMb2FkZXIuY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB1cmxzID0gY2wuZ2V0Q2xhc3NwYXRoKCkuc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSB1cmxzW2ldOwotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIlVSTCAiICsgaSArICI6IiArIHVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBub3QgaGFuZGxlZAotICAgICAgICB9Ci0gICAgICAgIGRpc3BsYXlDbGFzc3BhdGgoY2xhc3NMb2FkZXIuZ2V0UGFyZW50KCksICJwYXJlbnQtPiIgKyBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICB2b2lkIGxvYWQoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2wpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2wpOwotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoYy50b1N0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRpc3BsYXlDbGFzc3BhdGgoY2wsICJ1c2luZyBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIGdldExvZygpLmVycm9yKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBEZWJ1Z0FudEJ1aWxkTGlzdGVuZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKGZpbmFsIEJ1aWxkRXZlbnQgYnVpbGRFdmVudCkgewotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoYnVpbGRFdmVudC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChmaW5hbCBCdWlsZEV2ZW50IGJ1aWxkRXZlbnQpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKGJ1aWxkRXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoZmluYWwgQnVpbGRFdmVudCBidWlsZEV2ZW50KSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhidWlsZEV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChmaW5hbCBCdWlsZEV2ZW50IGJ1aWxkRXZlbnQpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKGJ1aWxkRXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKGZpbmFsIEJ1aWxkRXZlbnQgYnVpbGRFdmVudCkgewotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoYnVpbGRFdmVudC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKGZpbmFsIEJ1aWxkRXZlbnQgYnVpbGRFdmVudCkgewotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoYnVpbGRFdmVudC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChmaW5hbCBCdWlsZEV2ZW50IGJ1aWxkRXZlbnQpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKGJ1aWxkRXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3hmaXJlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4veGZpcmUvV3NnZW5Nb2pvLmphdmEgYi94ZmlyZS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3NlcnZpY2VtaXgvbWF2ZW4vcGx1Z2luL3hmaXJlL1dzZ2VuTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGJlNDgyLi4wMDAwMDAwCi0tLSBhL3hmaXJlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc2VydmljZW1peC9tYXZlbi9wbHVnaW4veGZpcmUvV3NnZW5Nb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnNlcnZpY2VtaXgubWF2ZW4ucGx1Z2luLnhmaXJlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS5nZW4uV3NHZW5UYXNrOwotCi0vKioKLSAqIFdzR2VuIG1vam8uIDxwLz4gSW1wbGVtZW50ZWQgYXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgWEZpcmUgV3NHZW4gQW50IHRhc2suCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0iamVyb21lQGNvZmZlZWJyZWFrcy5vcmciPkplcm9tZSBMYWNvc3RlPC9hPgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgd3NnZW4KLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKiBAcmVxdWlyZXNQcm9qZWN0Ci0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbgotICovCi1wdWJsaWMgY2xhc3MgV3NnZW5Nb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKLQotICAgIC8qKgotICAgICAqIFByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBVUkxzCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCB3c2RsczsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwYWNrYWdlfSIgYWxpYXM9InBhY2thZ2UiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGhlUGFja2FnZTsgLy8gcmVzZXJ2ZWQga2V5d29yZC4uLgotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2ZpbGV9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByb2ZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YmluZGluZ30iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmluZGluZzsKLQotICAgIC8qKgotICAgICAqIFdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXBpbGVTb3VyY2VSb290Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke291dHB1dERpcmVjdG9yeX0iCi0gICAgICogICAgICAgICAgICBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy94ZmlyZS93c2dlbiIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgcHJpdmF0ZSBQcmludFN0cmVhbSBzeXN0ZW1FcnI7Ci0KLSAgICAvL3ByaXZhdGUgUHJpbnRTdHJlYW0gc3lzdGVtT3V0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBteVN5c3RlbUVyciA9IG5ldyBQcmludFN0cmVhbShuZXcgTXlFcnJvclN0cmVhbSgpKTsKLQotICAgIC8vcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBteVN5c3RlbU91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgTXlPdXRwdXRTdHJlYW0oKSk7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHN5c3RlbUVyciA9IFN5c3RlbS5lcnI7Ci0gICAgICAgIC8vc3lzdGVtT3V0ID0gU3lzdGVtLm91dDsKLSAgICAgICAgU3lzdGVtLnNldEVycihteVN5c3RlbUVycik7Ci0gICAgICAgIC8vIFN5c3RlbS5zZXRPdXQobXlTeXN0ZW1PdXQpOyAvLyBjYXVzZXMgamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3I6Ci0gICAgICAgIC8vIEphdmEgaGVhcCBzcGFjZSBvbiBteSBib3gKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlYygpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgU3lzdGVtLnNldEVycihzeXN0ZW1FcnIpOwotICAgICAgICAgICAgLy8gU3lzdGVtLnNldE91dCggc3lzdGVtT3V0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBNeUVycm9yU3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgZmluYWwgY2hhciBjID0gKGNoYXIpIGI7Ci0gICAgICAgICAgICAvLyBzaG91bGRuJ3Qgd2UgaGFuZGxlICdccicgYXMgd2VsbCA/PwotICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGdldExvZygpLmVycm9yKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgTXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSAoY2hhcikgYjsKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCB3ZSBoYW5kbGUgJ1xyJyBhcyB3ZWxsID8/Ci0gICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbyhidWZmZXIpOwotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGlmICh3c2Rscy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFvdXRwdXREaXJlY3RvcnkuZXhpc3RzKCkgJiYgIW91dHB1dERpcmVjdG9yeS5ta2RpcnMoKSkgewotICAgICAgICAgICAgZ2V0TG9nKCkKLSAgICAgICAgICAgICAgICAgICAgLndhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBvdXRwdXQgZGlyZWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0RGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBleGlzdCBhbmQgY291bGRuJ3QgYmUgY3JlYXRlZC4gVGhlIGdvYWwgd2l0aCBwcm9iYWJseSBmYWlsLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgUHJvamVjdCBhbnRQcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLQotICAgICAgICBhbnRQcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobmV3IERlYnVnQW50QnVpbGRMaXN0ZW5lcigpKTsKLQotICAgICAgICBmaW5hbCBXc0dlblRhc2sgdGFzayA9IG5ldyBXc0dlblRhc2soKTsKLQotICAgICAgICB0YXNrLnNldFByb2plY3QoYW50UHJvamVjdCk7Ci0KLSAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFzay5zZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFzay5zZXRQcm9maWxlKHByb2ZpbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoZVBhY2thZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFzay5zZXRQYWNrYWdlKHRoZVBhY2thZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFzay5zZXRPdXRwdXREaXJlY3Rvcnkob3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3NkbHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHdzZGxVcmwgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICghd3NkbFVybC5jb250YWlucygiOi8vIikpIHsKLSAgICAgICAgICAgICAgICB3c2RsVXJsID0gbmV3IEZpbGUod3NkbFVybCkudG9VUkkoKS50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YXNrLnNldFdzZGwod3NkbFVybCk7Ci0KLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIkV4ZWN1dGluZyBYRmlyZSBXc0dlbiB0YXNrIHdpdGggdXJsOiAiICsgd3NkbFVybCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFzay5leGVjdXRlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oImNvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgIkFkZGluZyBvdXRwdXREaXJlY3RvcnkgdG8gc291cmNlIHJvb3Q6ICIgKyBvdXRwdXREaXJlY3RvcnkpOwotCi0gICAgICAgIHRoaXMucHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRGVidWdBbnRCdWlsZExpc3RlbmVyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChmaW5hbCBCdWlsZEV2ZW50IGJ1aWxkRXZlbnQpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKGJ1aWxkRXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoZmluYWwgQnVpbGRFdmVudCBidWlsZEV2ZW50KSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhidWlsZEV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKGZpbmFsIEJ1aWxkRXZlbnQgYnVpbGRFdmVudCkgewotICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoYnVpbGRFdmVudC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoZmluYWwgQnVpbGRFdmVudCBidWlsZEV2ZW50KSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhidWlsZEV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChmaW5hbCBCdWlsZEV2ZW50IGJ1aWxkRXZlbnQpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKGJ1aWxkRXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChmaW5hbCBCdWlsZEV2ZW50IGJ1aWxkRXZlbnQpIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKGJ1aWxkRXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoZmluYWwgQnVpbGRFdmVudCBidWlsZEV2ZW50KSB7Ci0gICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyhidWlsZEV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Cg==