ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvTUVUQS1JTkYvQ1ZTL0VudHJpZXMgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL01FVEEtSU5GL0NWUy9FbnRyaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTgzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL01FVEEtSU5GL0NWUy9FbnRyaWVzCkBAIC0wLDAgKzEgQEAKKy9NQU5JRkVTVC5NRi8xLjUvRnJpIEF1ZyAxNCAxOTo1MzowNCAyMDA5Ly8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvTUVUQS1JTkYvQ1ZTL1JlcG9zaXRvcnkgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL01FVEEtSU5GL0NWUy9SZXBvc2l0b3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGFhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL01FVEEtSU5GL0NWUy9SZXBvc2l0b3J5CkBAIC0wLDAgKzEgQEAKK29yZy5lY2xpcHNlLmJhYmVsL3BsdWdpbnMvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9NRVRBLUlORgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9NRVRBLUlORi9DVlMvUm9vdCBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvTUVUQS1JTkYvQ1ZTL1Jvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4YjA4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvTUVUQS1JTkYvQ1ZTL1Jvb3QKQEAgLTAsMCArMSBAQAorOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBlZjM5MGU0Li4yZWQyYjhkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTEsMTggKzEsMzEgQEAKIE1hbmlmZXN0LVZlcnNpb246IDEuMAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6IEJhYmVsIENvcmUgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYmFiZWwuY29yZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYmFiZWwuY29yZTtzaW5nbGV0b246PXRydWUKIEJ1bmRsZS1WZXJzaW9uOiAwLjguMC5xdWFsaWZpZXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UsCi0gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcywKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLmNvbmZpZ3VyYXRpb247dXNlczo9Im9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIiLAorIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuZmFjdG9yeSwKKyBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UsCisgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrczt1c2VzOj0ib3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5wcm94aW1pdHksb3JnLmVjbGlwc2VsYWJzLnRhcGlqaS50cmFuc2xhdG9yLnJiZS5iYWJlbC5idW5kbGUiLAorIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MuaW50ZXJuYWwsCiAgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5wcm94aW1pdHksCisgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsOworICB1c2VzOj0ib3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLAorICAgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnN0cmF0ZWd5LAorICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCisgICBvcmcuZWNsaXBzZWxhYnMudGFwaWppLnRyYW5zbGF0b3IucmJlLmJhYmVsLmJ1bmRsZSIsCisgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLm1hbmFnZXI7dXNlczo9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLG9yZy5lY2xpcHNlbGFicy50YXBpamkudHJhbnNsYXRvci5yYmUuYmFiZWwuYnVuZGxlIiwKICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UsCi0gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlciwKLSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2Uuc3RyYXRlZ3ksCisgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLmludGVybmFsO3VzZXM6PSJvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2Usb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlcixvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIsCisgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlcjt1c2VzOj0ib3JnLmVjbGlwc2VsYWJzLnRhcGlqaS50cmFuc2xhdG9yLnJiZS5iYWJlbC5idW5kbGUiLAorIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5zdHJhdGVneTt1c2VzOj0ib3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlcixvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2Usb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLAogIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLAotIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLnZpc2l0b3IsCi0gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS51dGlsCisgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuaW50ZXJuYWwsCisgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUudmlzaXRvcjt1c2VzOj0ib3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLG9yZy5lY2xpcHNlbGFicy50YXBpamkudHJhbnNsYXRvci5yYmUuYmFiZWwuYnVuZGxlIiwKKyBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWw7dXNlczo9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIgogUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcsCiAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IjMuNi4yIiwKKyBvcmcuZWNsaXBzZS5wZGUuY29yZTtidW5kbGUtdmVyc2lvbj0iMy43LjAiCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IDhiYjI5ZWEuLmVhYmM4ZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTIsNyArMiw3IEBACiBvdXRwdXQuLiA9IGJpbi8KIGJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCiAgICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGJpbi8KLXNyYy5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCiAgICAgICAgICAgICAgICBiaW4vLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwKK3NyYy5pbmNsdWRlcyA9IGJpbi8sXAogICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTQ0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3BsdWdpbi54bWwKQEAgLTAsMCArMSw2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgorPHBsdWdpbj4KKyAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImJhYmVsQ29uZmlndXJhdGlvbiIgbmFtZT0iYmFiZWxDb25maWd1cmF0aW9uLmV4c2QiIHNjaGVtYT0ic2NoZW1hL2JhYmVsQ29uZmlndXJhdGlvbi5leHNkIi8+CisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zY2hlbWEvYmFiZWxDb25maWd1cmF0aW9uLmV4c2QgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NjaGVtYS9iYWJlbENvbmZpZ3VyYXRpb24uZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjgzZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zY2hlbWEvYmFiZWxDb25maWd1cmF0aW9uLmV4c2QKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmJhYmVsLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuYmFiZWwuY29yZSIgaWQ9ImJhYmVsQ29uZmlndXJhdGlvbiIgbmFtZT0iYmFiZWxDb25maWd1cmF0aW9uIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFhwdCwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgVGFwaUpJIHRvIHByb3ZpZGUgYWNjZXNzIHRvIFRhcGlKSVByZWZlcmVuY2VzLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iSUNvbmZpZ3VyYXRpb24iLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0iSUNvbmZpZ3VyYXRpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyYXRpb24iLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgVGFwaUpJLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEFsZXhlaiBTdHJlbHpvdyAtIGNyZWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxMjI2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFsZXhlaiBTdHJlbHpvdy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBBbGV4ZWogU3RyZWx6b3cgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5JUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLklQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLlByb3BlcnRpZXNEZXNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5Qcm9wZXJ0aWVzU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworCisvKioKKyAqIFNpbmdlbHRvbiwgd2hpY2ggcHJvdmlkZXMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjb25maWd1cmF0aW9uIG9mOgorICogPGxpPlRhcGlKSSBQcmVmZXJlbmNlIFBhZ2U6IGludGVyZmFjZSBpcyB7QGxpbmsgSUNvbmZpZ3VyYXRpb259PC9saT4KKyAqIDxsaT5TZXJpYWxpemluZyB7QGxpbmsgTWVzc2FnZXNCdW5kbGVHcm91cH0gdG8gcHJvcGVydHkgZmlsZTwvbGk+CisgKiA8bGk+RGVzZXJpYWxpemluZyB7QGxpbmsgTWVzc2FnZXNCdW5kbGVHcm91cH0gZnJvbSBwcm9wZXJ0eSBmaWxlPC9saT4KKyAqIDxicj48YnI+CisgKiAKKyAqIEBhdXRob3IgQWxleGVqIFN0cmVsem93CisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlciB7CisKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBJTlNUQU5DRTsKKwkKKwlwcml2YXRlIElDb25maWd1cmF0aW9uIGNvbmZpZzsKKwkKKwlwcml2YXRlIElQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZyBzZXJpYWxpemVyQ29uZmlnOworCQorCXByaXZhdGUgSVByb3BlcnRpZXNEZXNlcmlhbGl6ZXJDb25maWcgZGVzZXJpYWxpemVyQ29uZmlnOworCQorCXByaXZhdGUgQ29uZmlndXJhdGlvbk1hbmFnZXIoKSB7CisJCWNvbmZpZyA9IGdldENvbmZpZygpOworCX0KKwkKKwlwcml2YXRlIElDb25maWd1cmF0aW9uIGdldENvbmZpZygpIHsKKwkJCisJCUlFeHRlbnNpb25Qb2ludCBleHRwID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKKyAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYmFiZWwuY29yZSIgKyAiLmJhYmVsQ29uZmlndXJhdGlvbiIpOworICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dHAuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CisgICAgICAgIAorICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoICE9IDApIHsKKyAgICAgICAgCXRyeSB7CisJCQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbikgZWxlbWVudHNbMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKKyAgICAgICAgCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisgICAgICAgIH0gCisgICAgCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7CisJCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7CisJCQlJTlNUQU5DRSA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpOworCQl9CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiBUYXBpSkkgY29uZmlndXJhdGlvbgorCSAqLworCXB1YmxpYyBJQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5jb25maWc7CisJfQorCisJLyoqCisJICogQHJldHVybiBDb25maWcgbmVlZGVkIGZvciB7QGxpbmsgUHJvcGVydGllc1NlcmlhbGl6ZXJ9CisJICovCisJcHVibGljIElQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZyBnZXRTZXJpYWxpemVyQ29uZmlnKCkgeworCQlyZXR1cm4gc2VyaWFsaXplckNvbmZpZzsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2VyaWFsaXplckNvbmZpZyBUaGUgY29uZmlnIGZvciBzZXJpYWxpemF0aW9uCisJICovCisJcHVibGljIHZvaWQgc2V0U2VyaWFsaXplckNvbmZpZyhJUHJvcGVydGllc1NlcmlhbGl6ZXJDb25maWcgc2VyaWFsaXplckNvbmZpZykgeworCQl0aGlzLnNlcmlhbGl6ZXJDb25maWcgPSBzZXJpYWxpemVyQ29uZmlnOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gQ29uZmlnIG5lZWRlZCBmb3Ige0BsaW5rIFByb3BlcnRpZXNEZXNlcmlhbGl6ZXJ9CisJICovCisJcHVibGljIElQcm9wZXJ0aWVzRGVzZXJpYWxpemVyQ29uZmlnIGdldERlc2VyaWFsaXplckNvbmZpZygpIHsKKwkJcmV0dXJuIGRlc2VyaWFsaXplckNvbmZpZzsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2VyaWFsaXplckNvbmZpZyBUaGUgY29uZmlnIGZvciBkZXNlcmlhbGl6YXRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNlcmlhbGl6ZXJDb25maWcoCisJCQlJUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZyBkZXNlcmlhbGl6ZXJDb25maWcpIHsKKwkJdGhpcy5kZXNlcmlhbGl6ZXJDb25maWcgPSBkZXNlcmlhbGl6ZXJDb25maWc7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9jb25maWd1cmF0aW9uL0RpcnR5SGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9jb25maWd1cmF0aW9uL0RpcnR5SGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGRlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL2NvbmZpZ3VyYXRpb24vRGlydHlIYWNrLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbGV4ZWogU3RyZWx6b3cuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgQWxleGVqIFN0cmVsem93IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5BYnN0cmFjdE1lc3NhZ2VNb2RlbDsKKworLyoqCisgKiBDb250YWlucyBmb2xsb3dpbmcgdHdvIDxiPmRpcnR5PC9iPiB3b3JrYXJvdW5kIGZsYWdzOgorICogPGxpPjxiPmZpcmVFbmFibGVkOjwvYj4gZGVhY3RpdmF0ZXMge0BsaW5rIFByb3BlcnR5Q2hhbmdlRXZlbnR9LWZpcmUgaW4ge0BsaW5rIEFic3RyYWN0TWVzc2FnZU1vZGVsfTwvbGk+CisgKiA8bGk+PGI+ZWRpdG9yTW9kaWZpY2F0aW9uRW5hYmxlZDo8L2I+IHByZXZlbnRzIDxjb2RlPkVjbGlwc2VQcm9wZXJ0aWVzRWRpdG9yUmVzb3VyY2Ujc2V0VGV4dDwvY29kZT48L2xpPgorICogPGJyPjxicj4KKyAqIDxiPldlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0aGlzIHNvbWVob3chISEhISEhISE8L2I+CisgKiA8YnI+PGJyPgorICogCisgKiBAYXV0aG9yIEFsZXhlaiBTdHJlbHpvdworICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGlydHlIYWNrIHsKKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZmlyZUVuYWJsZWQgPSB0cnVlOyAvLyBubyBwcm9wZXJ0eS1maXJlIGNhbGxzIGluIEFic3RyYWN0TWVzc2FnZU1vZGVsCisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlZGl0b3JNb2RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsgLy8gbm8gc2V0VGV4dCBpbiBFY2xpcHNlUHJvcGVydGllc0VkaXRvclJlc291cmNlCisJCQkJCQkJCQkJCQkvLyBzZXQgdGhpcywgaWYgeW91IHNlcmlhbGl6ZSEKKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpcmVFbmFibGVkKCkgeworCQlyZXR1cm4gZmlyZUVuYWJsZWQ7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldEZpcmVFbmFibGVkKGJvb2xlYW4gZmlyZUVuYWJsZWQpIHsKKwkJRGlydHlIYWNrLmZpcmVFbmFibGVkID0gZmlyZUVuYWJsZWQ7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWRpdG9yTW9kaWZpY2F0aW9uRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGVkaXRvck1vZGlmaWNhdGlvbkVuYWJsZWQ7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldEVkaXRvck1vZGlmaWNhdGlvbkVuYWJsZWQoCisJCQlib29sZWFuIGVkaXRvck1vZGlmaWNhdGlvbkVuYWJsZWQpIHsKKwkJRGlydHlIYWNrLmVkaXRvck1vZGlmaWNhdGlvbkVuYWJsZWQgPSBlZGl0b3JNb2RpZmljYXRpb25FbmFibGVkOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvY29uZmlndXJhdGlvbi9JQ29uZmlndXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9jb25maWd1cmF0aW9uL0lDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1ZDU1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvY29uZmlndXJhdGlvbi9JQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQWxleGVqIFN0cmVsem93LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEFsZXhlaiBTdHJlbHpvdyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLmNvbmZpZ3VyYXRpb247CisKKy8qKgorICogSW50ZXJmYWNlIHRvIFRhcGlKSSBwcmVmZXJlbmNlIHBhZ2UuCisgKiAKKyAqIEBhdXRob3IgQWxleGVqIFN0cmVsem93CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb24geworCisJYm9vbGVhbiBnZXRBdWRpdFNhbWVWYWx1ZSgpOworCisJYm9vbGVhbiBnZXRBdWRpdE1pc3NpbmdWYWx1ZSgpOworCisJYm9vbGVhbiBnZXRBdWRpdE1pc3NpbmdMYW5ndWFnZSgpOworCisJYm9vbGVhbiBnZXRBdWRpdFJiKCk7CisKKwlib29sZWFuIGdldEF1ZGl0UmVzb3VyY2UoKTsKKworCVN0cmluZyBnZXROb25SYlBhdHRlcm4oKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9mYWN0b3J5L01lc3NhZ2VGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL2ZhY3RvcnkvTWVzc2FnZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGU3YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9mYWN0b3J5L01lc3NhZ2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbGV4ZWogU3RyZWx6b3cuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgQWxleGVqIFN0cmVsem93IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuZmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlOworCisvKioKKyAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIGEge0BsaW5rIElNZXNzYWdlfQorICogCisgKiBAYXV0aG9yIEFsZXhlaiBTdHJlbHpvdworICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUZhY3RvcnkgeworCisgICAgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBtZXNzYWdlCisgICAgICogQHBhcmFtIGxvY2FsZSBUaGUge0BsaW5rIExvY2FsZX0KKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHtAbGluayBJTWVzc2FnZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBTdHJpbmcgbCA9IGxvY2FsZSA9PSBudWxsID8gIltkZWZhdWx0XSIgOiBsb2NhbGUudG9TdHJpbmcoKTsKKyAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5JTkZPLCAiY3JlYXRlTWVzc2FnZSwga2V5OiAiICsga2V5ICsgIiBsb2NhbGU6ICIgKyBsKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZShrZXksIGxvY2FsZSk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9mYWN0b3J5L01lc3NhZ2VzQnVuZGxlR3JvdXBGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL2ZhY3RvcnkvTWVzc2FnZXNCdW5kbGVHcm91cEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk0NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9mYWN0b3J5L01lc3NhZ2VzQnVuZGxlR3JvdXBGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbGV4ZWogU3RyZWx6b3cuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgQWxleGVqIFN0cmVsem93IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuZmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnN0cmF0ZWd5LlByb3BlcnRpZXNGaWxlR3JvdXBTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CisKKy8qKgorICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgTWVzc2FnZXNCdW5kbGVHcm91cH0gd2l0aCBhIHtAbGluayBQcm9wZXJ0aWVzRmlsZUdyb3VwU3RyYXRlZ3l9LgorICogVGhpcyBpcyBpbiB1c2Ugd2hlbiB3ZSB3b3JrIHdpdGggVGFwaUpJIG9ubHkgYW5kIG5vdCB3aXRoIDxjb2RlPkVjbGlwc2VQcm9wZXJ0aWVzRWRpdG9yUmVzb3VyY2U8L2NvZGU+LgorICogPGJyPjxicj4KKyAqIAorICogQGF1dGhvciBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzQnVuZGxlR3JvdXBGYWN0b3J5IHsKKwkKKyAgICBwdWJsaWMgc3RhdGljIElNZXNzYWdlc0J1bmRsZUdyb3VwIGNyZWF0ZUJ1bmRsZUdyb3VwKElSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIAkKKyAgICAgICAgICAgIEZpbGUgaW9GaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0UmF3TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VzQnVuZGxlR3JvdXAobmV3IFByb3BlcnRpZXNGaWxlR3JvdXBTdHJhdGVneShpb0ZpbGUsIAorICAgICAgICAgICAgCQlDb25maWd1cmF0aW9uTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNlcmlhbGl6ZXJDb25maWcoKSwgCisgICAgICAgICAgICAJCUNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RGVzZXJpYWxpemVyQ29uZmlnKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvSU1lc3NhZ2UuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9JTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZGFlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvSU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBSZWl0ZXJlciwgQWxleGVqIFN0cmVsem93LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1hcnRpbiBSZWl0ZXJlciAtIGluaXRpYWwgQVBJCisgKiAgICAgQWxleGVqIFN0cmVsem93IC0gZXh0ZW5kZWQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2U7CisKKy8qKgorICogSW50ZXJmYWNlLCBpbXBsZW1lbnRlZCBieSB7QGxpbmsgTWVzc2FnZX0uIEEgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdGlvbiBvZiBhCisgKiBrZXktdmFsdWUgcGFpciwgd2hpY2ggY2FuIGJlIGZvdW5kIGluIHJlc291cmNlIGJ1bmRsZXMgKDEgcm93KS4KKyAqIDxicj48YnI+CisgKiAKKyAqIEBhdXRob3IgTWFydGluIFJlaXRlcmVyLCBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGludGVyZmFjZSBJTWVzc2FnZSB7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZXNzYWdlIGtleSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXkuCisgICAgICovCisJU3RyaW5nIGdldEtleSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVzc2FnZSB0ZXh0LgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGV4dC4KKyAgICAgKi8KKwlTdHJpbmcgZ2V0VmFsdWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lc3NhZ2UgbG9jYWxlLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYWxlCisgICAgICovCisJTG9jYWxlIGdldExvY2FsZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXNzYWdlICg8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqIG5vIGNvbW1lbnRzKS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbW1lbnQuCisgICAgICovCisJU3RyaW5nIGdldENvbW1lbnQoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGlzIG1lc3NhZ2UgaXMgYWN0aXZlIG9yIG5vdC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWVzc2FnZSBpcyBhY3RpdmUuCisgICAgICovCisJYm9vbGVhbiBpc0FjdGl2ZSgpOworCisJLyoqCisJICogQHJldHVybiBUaGUgdG9TdHJpbmcgcmVwcmVzZW50YXRpb24KKwkgKi8KKwlTdHJpbmcgdG9TdHJpbmcoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhY3RpdmUgb3Igbm90LiAgQW4gaW5hY3RpdmUgbWVzc2FnZSBpcworICAgICAqIG9uZSB0aGF0IHdlIGNvbnRpbnVlIHRvIGtlZXAgdHJhY2sgb2YsIGJ1dCB3aWxsIG5vdCBiZSBwaWNrZWQKKyAgICAgKiB1cCBieSBpbnRlcm5hdGlvbmFsaXphdGlvbiBtZWNoYW5pc20gKGUuZy4gPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+KS4KKyAgICAgKiBUeXBpY2FsbHksIHRob3NlIGFyZSBjb21tZW50ZWQgKGkuZS4gLy8pIGtleS90ZXh0IHBhaXJzIGluIGEKKyAgICAgKiAqLnByb3BlcnRpZXMgZmlsZS4KKyAgICAgKiBAcGFyYW0gYWN0aXZlIFRoZSBhY3RpdmUgdG8gc2V0LgorICAgICAqLworCXZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgY29tbWVudC4KKyAgICAgKiBAcGFyYW0gY29tbWVudCBUaGUgY29tbWVudCB0byBzZXQuCisgICAgICovCisJdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFjdHVhbCBtZXNzYWdlIHRleHQuCisgICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gc2V0LgorICAgICAqLworCXZvaWQgc2V0VGV4dChTdHJpbmcgdGVzdCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9JTWVzc2FnZXNCdW5kbGUuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9JTWVzc2FnZXNCdW5kbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjg0M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL0lNZXNzYWdlc0J1bmRsZS5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBSZWl0ZXJlciwgQWxleGVqIFN0cmVsem93LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1hcnRpbiBSZWl0ZXJlciAtIGluaXRpYWwgQVBJCisgKiAgICAgQWxleGVqIFN0cmVsem93IC0gZXh0ZW5kZWQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5JTWVzc2FnZXNSZXNvdXJjZTsKKworLyoqCisgKiBJbnRlcmZhY2UsIGltcGxlbWVudGVkIGJ5IHtAbGluayBNZXNzYWdlc0J1bmRsZX0uIEEgbWVzc2FnZXMgYnVuZGxlIGlzIGFuIGFic3RyYWN0aW9uIG9mIGEKKyAqIHJlc291cmNlIGJ1bmRsZSAodGhlICoucHJvcGVydGllcy1maWxlKS4KKyAqIDxicj48YnI+CisgKiAKKyAqIEBhdXRob3IgTWFydGluIFJlaXRlcmVyLCBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGludGVyZmFjZSBJTWVzc2FnZXNCdW5kbGUgeworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJlZm9yZSB0aGlzIG9iamVjdCB3aWxsIGJlIGRpc2NhcmRlZC4KKyAgICAgKi8KKwl2b2lkIGRpc3Bvc2UoKTsKKworICAgIC8qKgorICAgICAqIFJlbmFtZXMgYSBtZXNzYWdlIGtleS4KKyAgICAgKiBAcGFyYW0gc291cmNlS2V5IHRoZSBtZXNzYWdlIGtleSB0byByZW5hbWUKKyAgICAgKiBAcGFyYW0gdGFyZ2V0S2V5IHRoZSBuZXcga2V5IGZvciB0aGUgbWVzc2FnZQorICAgICAqIEB0aHJvd3MgTWVzc2FnZUV4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGtleSBhbHJlYWR5IGV4aXN0cworICAgICAqLworCXZvaWQgcmVuYW1lTWVzc2FnZUtleShTdHJpbmcgc291cmNlS2V5LCBTdHJpbmcgdGFyZ2V0S2V5KTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBtZXNzYWdlIGZyb20gdGhpcyBtZXNzYWdlcyBidW5kbGUuCisgICAgICogQHBhcmFtIG1lc3NhZ2VLZXkgdGhlIGtleSBvZiB0aGUgbWVzc2FnZSB0byByZW1vdmUKKyAgICAgKi8KKwl2b2lkIHJlbW92ZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VLZXkpOworCisgICAgLyoqCisgICAgICogRHVwbGljYXRlcyBhIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHNvdXJjZUtleSB0aGUgbWVzc2FnZSBrZXkgdG8gZHVwbGljYXRlCisgICAgICogQHBhcmFtIHRhcmdldEtleSB0aGUgbmV3IG1lc3NhZ2Uga2V5CisgICAgICogQHRocm93cyBNZXNzYWdlRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQga2V5IGFscmVhZHkgZXhpc3RzCisgICAgICovCisJdm9pZCBkdXBsaWNhdGVNZXNzYWdlKFN0cmluZyBzb3VyY2VLZXksIFN0cmluZyB0YXJnZXRLZXkpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG9jYWxlIGZvciB0aGUgbWVzc2FnZXMgYnVuZGxlICg8Y29kZT5udWxsPC9jb2RlPiBhc3N1bWVzCisgICAgICogdGhlIGRlZmF1bHQgc3lzdGVtIGxvY2FsZSkuCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhbGUuCisgICAgICovCisJTG9jYWxlIGdldExvY2FsZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgbWVzc2FnZSBrZXlzIG1ha2luZyB1cCB0aGlzIG1lc3NhZ2VzIGJ1bmRsZS4KKyAgICAgKiBAcmV0dXJuIG1lc3NhZ2Uga2V5cworICAgICAqLworCVN0cmluZ1tdIGdldEtleXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHRoZSBnaXZlbiBrZXksIGlmIHRoZSBrZXkgZXhpc3RzLgorICAgICAqIEBwYXJhbSBrZXksIHRoZSBrZXkgb2YgYSBtZXNzYWdlLgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIHRoZSBnaXZlbiBrZXkuCisgICAgICovCisJU3RyaW5nIGdldFZhbHVlKFN0cmluZyBrZXkpOworCisgICAgLyoqCisgICAgICogT2J0YWlucyB0aGUgc2V0IG9mIDxjb2RlPk1lc3NhZ2U8L2NvZGU+IG9iamVjdHMgaW4gdGhpcyBidW5kbGUuCisgICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+TWVzc2FnZTwvY29kZT4gb2JqZWN0cyBpbiB0aGlzIGJ1bmRsZQorICAgICAqLworCUNvbGxlY3Rpb248SU1lc3NhZ2U+IGdldE1lc3NhZ2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0ga2V5IGEgbWVzc2FnZSBrZXkKKyAgICAgKiBAcmV0dXJuIGEgbWVzc2FnZQorICAgICAqLworCUlNZXNzYWdlIGdldE1lc3NhZ2UoU3RyaW5nIGtleSk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGVtcHR5IG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGtleSB0aGUgbmV3IG1lc3NhZ2Uga2V5CisgICAgICovCisJdm9pZCBhZGRNZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBtZXNzYWdlcyBmcm9tIHRoaXMgbWVzc2FnZXMgYnVuZGxlLgorICAgICAqIEBwYXJhbSBtZXNzYWdlS2V5cyB0aGUga2V5cyBvZiB0aGUgbWVzc2FnZXMgdG8gcmVtb3ZlCisgICAgICovCisJdm9pZCByZW1vdmVNZXNzYWdlcyhTdHJpbmdbXSBtZXNzYWdlS2V5cyk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21tZW50IGZvciB0aGlzIG1lc3NhZ2VzIGJ1bmRsZS4KKyAgICAgKiBAcGFyYW0gY29tbWVudCBUaGUgY29tbWVudCB0byBzZXQuCisgICAgICovCisJdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG92ZXJhbGwgY29tbWVudCwgb3IgZGVzY3JpcHRpb24sIGZvciB0aGlzIG1lc3NhZ2VzIGJ1bmRsZS4uCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21tZW50LgorICAgICAqLworCVN0cmluZyBnZXRDb21tZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIG1lc3NhZ2VzIHJlc291cmNlIGltcGxlbWVudGF0aW9uLgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKwlJTWVzc2FnZXNSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIG1lc3NhZ2UgZnJvbSB0aGlzIG1lc3NhZ2VzIGJ1bmRsZSBhbmQgYWRkcyBpdCdzIHBhcmVudCBrZXkgdG8gYnVuZGxlLgorICAgICAqIEUuZy46IGtleSA9IGEuYi5jIGdldHMgZGVsZXRlZCwgYS5iIGdldHMgYWRkZWQgd2l0aCBhIGRlZmF1bHQgbWVzc2FnZQorICAgICAqIEBwYXJhbSBtZXNzYWdlS2V5IHRoZSBrZXkgb2YgdGhlIG1lc3NhZ2UgdG8gcmVtb3ZlCisgICAgICovCisJdm9pZCByZW1vdmVNZXNzYWdlQWRkUGFyZW50S2V5KFN0cmluZyBrZXkpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL0lNZXNzYWdlc0J1bmRsZUdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvSU1lc3NhZ2VzQnVuZGxlR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGU1YzBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL0lNZXNzYWdlc0J1bmRsZUdyb3VwLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFJlaXRlcmVyLCBBbGV4ZWogU3RyZWx6b3cuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWFydGluIFJlaXRlcmVyIC0gaW5pdGlhbCBBUEkKKyAqICAgICBBbGV4ZWogU3RyZWx6b3cgLSBleHRlbmRlZCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2Uuc3RyYXRlZ3kuUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5OworCisvKioKKyAqIEludGVyZmFjZSwgaW1wbGVtZW50ZWQgYnkge0BsaW5rIE1lc3NhZ2VzQnVuZGxlR3JvdXB9LiBBIG1lc3NhZ2VzIGJ1bmRsZQorICogZ3JvdXAgaXMgYW4gYWJzdHJhY3Rpb24gb2YgYSBncm91cCBvZiByZXNvdXJjZSBidW5kbGVzLiA8YnI+CisgKiA8YnI+CisgKiAKKyAqIEBhdXRob3IgTWFydGluIFJlaXRlcmVyLCBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGludGVyZmFjZSBJTWVzc2FnZXNCdW5kbGVHcm91cCB7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBhbGwgYnVuZGxlcyBpbiB0aGlzIGdyb3VwLgorCSAqIEByZXR1cm4gdGhlIGJ1bmRsZXMgaW4gdGhpcyBncm91cAorCSAqLworCUNvbGxlY3Rpb248SU1lc3NhZ2VzQnVuZGxlPiBnZXRNZXNzYWdlc0J1bmRsZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3VwcGxpZWQga2V5IGlzIGFscmVhZHkgZXhpc3RpbmcgaW4gdGhpcyBncm91cC4KKwkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdGhhdCBzaGFsbCBiZSB0ZXN0ZWQuCisJICogQHJldHVybiB0cnVlIDw9PiBUaGUga2V5IGlzIGFscmVhZHkgZXhpc3RpbmcuCisJICovCisJYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KTsKKworCS8qKgorCSAqIEdldHMgYWxsIG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBrZXkuCisJICogQHBhcmFtIGtleSBhIG1lc3NhZ2Uga2V5CisJICogQHJldHVybiBtZXNzYWdlcworCSAqLworCUlNZXNzYWdlW10gZ2V0TWVzc2FnZXMoU3RyaW5nIGtleSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZXNzYWdlIG1hdGNoaW5nIGdpdmVuIGtleSBhbmQgbG9jYWxlLgorICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgbWF0Y2hpbmcgZW50cnkgdG8gcmV0cmlldmUgdGhlIG1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIGEgbWVzc2FnZQorICAgICAqLworCUlNZXNzYWdlIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZXNzYWdlcyBidW5kbGUgbWF0Y2hpbmcgZ2l2ZW4gbG9jYWxlLgorICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZSBvZiBidW5kbGUgdG8gcmV0cmVpdmUKKyAgICAgKiBAcmV0dXJuIGEgYnVuZGxlCisgICAgICovCisJSU1lc3NhZ2VzQnVuZGxlIGdldE1lc3NhZ2VzQnVuZGxlKExvY2FsZSBsb2NhbGUpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBtZXNzYWdlcyBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5IGZyb20gYWxsIG1lc3NhZ2VzIGJ1bmRsZS4KKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgbWVzc2FnZXMgdG8gcmVtb3ZlCisgICAgICovCisJdm9pZCByZW1vdmVNZXNzYWdlcyhTdHJpbmcgbWVzc2FnZUtleSk7CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgZ2l2ZW4ga2V5IGZvdW5kIGluIHRoaXMgYnVuZGxlIGdyb3VwLgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBmaW5kCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUga2V5IGV4aXN0cyBpbiB0aGlzIGJ1bmRsZSBncm91cC4KKyAgICAgKi8KKwlib29sZWFuIGlzS2V5KFN0cmluZyBrZXkpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIG1lc3NhZ2VzIGJ1bmRsZSB0byB0aGlzIGdyb3VwLgorICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZSBvZiB0aGUgYnVuZGxlCisgICAgICogQHBhcmFtIG1lc3NhZ2VzQnVuZGxlIGJ1bmRsZSB0byBhZGQKKyAgICAgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24gaWYgYSBtZXNzYWdlcyBidW5kbGUgZm9yIHRoZSBzYW1lIGxvY2FsZSBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKi8KKwl2b2lkIGFkZE1lc3NhZ2VzQnVuZGxlKExvY2FsZSBsb2NhbGUsIElNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFsbCBrZXlzIGZyb20gYWxsIG1lc3NhZ2VzIGJ1bmRsZXMuCisgICAgICogQHJldHVybiBhbGwga2V5cyBmcm9tIGFsbCBtZXNzYWdlcyBidW5kbGVzCisgICAgICovCisJU3RyaW5nW10gZ2V0TWVzc2FnZUtleXMoKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gZW1wdHkgbWVzc2FnZSB0byBldmVyeSBtZXNzYWdlcyBidW5kbGUgb2YgdGhpcyBncm91cCB3aXRoIHRoZQorICAgICAqIGdpdmVuLgorICAgICAqIEBwYXJhbSBrZXkgVGhlIG1lc3NhZ2Uga2V5CisgICAgICovCisJdm9pZCBhZGRNZXNzYWdlcyhTdHJpbmcga2V5KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBidW5kbGVzIGluIHRoaXMgZ3JvdXAuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGJ1bmRsZXMgaW4gdGhpcyBncm91cAorICAgICAqLworCWludCBnZXRNZXNzYWdlc0J1bmRsZUNvdW50KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoaXMgbWVzc2FnZXMgYnVuZGxlIGdyb3VwIG5hbWUuIFRoYXQgaXMgdGhlIG5hbWUsIHdoaWNoIGlzIHVzZWQKKyAgICAgKiBmb3IgdGhlIHRhYiBvZiB0aGUgTXVsdGlQYWdlRWRpdG9yUGFydC4KKyAgICAgKiBAcmV0dXJuIGJ1bmRsZSBncm91cCBuYW1lCisgICAgICovCisJU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIEdldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgYnVuZGxlIGdyb3VwLiBUaGF0IGlzIHVzdWFsbHk6IDxkaXJlY3Rvcnk+Ii4iPGRlZmF1bHQtZmlsZW5hbWU+LgorCSAqIFRoZSBkZWZhdWx0IGZpbGVuYW1lIGlzIHdpdGhvdXQgdGhlIHN1ZmZpeCAoZS5nLiBfZW4sIG9yIF9lbl9HQikuCisJICogQHJldHVybiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUgZ3JvdXAKKwkgKi8KKwlTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVJZCgpOworCisJLyoqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnVuZGxlIGdyb3VwIGhhcyB7QGxpbmsgUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5fSBhcyBzdHJhdGVneSwKKwkgKiAJZWxzZSA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgaXMgdGhlIGNhc2UsIHdoZW4gb25seSBUYXBpSkkgZWRpdHMgdGhlIHJlc291cmNlIGJ1bmRsZXMgYW5kIG5vCisJICogIGhhdmUgYmVlbiBvcGVuZWQuCisJICovCisJYm9vbGVhbiBoYXNQcm9wZXJ0aWVzRmlsZUdyb3VwU3RyYXRlZ3koKTsKKworCS8qKgorCSAqIFdoZXRoZXIgdGhlIGdpdmVuIGtleSBpcyBmb3VuZCBpbiB0aGlzIG1lc3NhZ2VzIGJ1bmRsZSBncm91cC4KKwkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gZmluZAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGtleSBleGlzdHMgaW4gdGhpcyBidW5kbGUgZ3JvdXAuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlS2V5KFN0cmluZyBrZXkpOworCisJLyoqCisJICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCwgdGhlIHJlc291cmNlIGJ1bmRsZSBncm91cCBpcyBpbi4KKwkgKiBAcmV0dXJuIFRoZSBwcm9qZWN0IG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgSU1lc3NhZ2VzQnVuZGxlfSBmcm9tIHRoZSBncm91cC4KKwkgKiBAcGFyYW0gbWVzc2FnZXNCdW5kbGUgVGhlIGJ1bmRsZSB0byByZW1vdmUuCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZXNCdW5kbGUoSU1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlKTsKKworCS8qKgorCSAqIENhbGxlZCBiZWZvcmUgdGhpcyBvYmplY3Qgd2lsbCBiZSBkaXNjYXJkZWQuIERpc3Bvc2VzIHRoZSB1bmRlcmx5aW5nCisJICogTWVzc2FnZUJ1bmRsZXMKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7CisKKwkvKioKKwkgKiBSZW1vdmVzIG1lc3NhZ2VzIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkgZnJvbSBhbGwgbWVzc2FnZXMgYnVuZGxlIGFuZCBhZGQKKwkgKiBpdCdzIHBhcmVudCBrZXkgdG8gYnVuZGxlcy4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgbWVzc2FnZXMgdG8gcmVtb3ZlCisJICovCisJdm9pZCByZW1vdmVNZXNzYWdlc0FkZFBhcmVudEtleShTdHJpbmcga2V5KTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9JTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvSU1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9JTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9JTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmphdmEKaW5kZXggMmI5M2Q1NC4uNzBmODY1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL0lNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvSU1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCkBAIC04LDE3ICs4LDIzIEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2U7CisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLklNZXNzYWdlc1Jlc291cmNlOwogCiAvKioKICAqIExpc3RlbmVyIGJlaW5nIG5vdGlmaWVkIHdoZW4gYSB7QGxpbmsgSU1lc3NhZ2VzUmVzb3VyY2V9IGNvbnRlbnQgY2hhbmdlcy4KKyAqIAogICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7CiAKIAkvKioKIAkgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIG1lc3NhZ2VzIHJlc291cmNlIGhhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdGhhdCBjaGFuZ2VkCisJICogCisJICogQHBhcmFtIHJlc291cmNlCisJICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgdGhhdCBjaGFuZ2VkCiAJICovCi0gICAgdm9pZCByZXNvdXJjZUNoYW5nZWQoSU1lc3NhZ2VzUmVzb3VyY2UgcmVzb3VyY2UpOworCXZvaWQgcmVzb3VyY2VDaGFuZ2VkKElNZXNzYWdlc1Jlc291cmNlIHJlc291cmNlKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9NZXNzYWdlc0J1bmRsZUdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvTWVzc2FnZXNCdW5kbGVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjA0OGFkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9NZXNzYWdlc0J1bmRsZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBQYXNjYWwgRXNzaWVtYnJlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLklNZXNzYWdlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5zdHJhdGVneS5JTWVzc2FnZXNCdW5kbGVHcm91cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbC5CYWJlbFV0aWxzOwotCi0vKioKLSAqIEdyb3VwaW5nIG9mIGFsbCBtZXNzYWdlcyBidW5kbGUgb2YgdGhlIHNhbWUga2luZC4KLSAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZSAocGFzY2FsQGVzc2llbWJyZS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlc0J1bmRsZUdyb3VwIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTW9kZWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcltdCi0gICAgICAgICAgICBFTVBUWV9HUk9VUF9MSVNURU5FUlMgPSBuZXcgSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcltdIHt9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VbXSBFTVBUWV9NRVNTQUdFUyA9IG5ldyBNZXNzYWdlW10ge307Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTUVTU0FHRVNfQlVORExFX0NPVU5UID0KLSAgICAgICAgICAgICJtZXNzYWdlc0J1bmRsZUNvdW50IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0tFWV9DT1VOVCA9Ci0gICAgICAgICJrZXlDb3VudCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBGb3Igc2VyaWFsaXphdGlvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTk3Nzg0OTUzNDE5MTM4NDMyNEw7Ci0gICAgLyoqIEJ1bmRsZXMgZm9ybWluZyB0aGUgZ3JvdXAgKGtleT1Mb2NhbGU7IHZhbHVlPU1lc3NhZ2VzQnVuZGxlKS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxMb2NhbGUsTWVzc2FnZXNCdW5kbGU+IGxvY2FsZUJ1bmRsZXMgPSBuZXcgSGFzaE1hcDxMb2NhbGUsTWVzc2FnZXNCdW5kbGU+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBrZXlzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOyAKLSAgICBwcml2YXRlIGZpbmFsIElNZXNzYWdlc0J1bmRsZUxpc3RlbmVyIG1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IE1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIoKTsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIElNZXNzYWdlc0J1bmRsZUdyb3VwU3RyYXRlZ3kgZ3JvdXBTdHJhdGVneTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGVbXSBFTVBUWV9MT0NBTEVTID0gbmV3IExvY2FsZVtdIHt9OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlcyBidW5kbGUgZ3JvdXAuCi0gICAgICogQHBhcmFtIGdyb3VwU3RyYXRlZ3kgYSBJTWVzc2FnZXNCdW5kbGVHcm91cFN0cmF0ZWd5IGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VzQnVuZGxlR3JvdXAoSU1lc3NhZ2VzQnVuZGxlR3JvdXBTdHJhdGVneSBncm91cFN0cmF0ZWd5KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuZ3JvdXBTdHJhdGVneSA9IGdyb3VwU3RyYXRlZ3k7Ci0gICAgICAgIHRoaXMubmFtZSA9IGdyb3VwU3RyYXRlZ3kuY3JlYXRlTWVzc2FnZXNCdW5kbGVHcm91cE5hbWUoKTsKLSAgICAgICAgTWVzc2FnZXNCdW5kbGVbXSBidW5kbGVzID0gZ3JvdXBTdHJhdGVneS5sb2FkTWVzc2FnZXNCdW5kbGVzKCk7Ci0gICAgICAgIGlmIChidW5kbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2VzQnVuZGxlKGJ1bmRsZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENhbGxlZCBiZWZvcmUgdGhpcyBvYmplY3Qgd2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICogRGlzcG9zZXMgdGhlIHVuZGVybHlpbmcgTWVzc2FnZUJ1bmRsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIAlmb3IgKE1lc3NhZ2VzQnVuZGxlIG1iIDogZ2V0TWVzc2FnZXNCdW5kbGVzKCkpIHsKLSAgICAJCXRyeSB7Ci0gICAgCQkJbWIuZGlzcG9zZSgpOwotICAgIAkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAJCQkvL0ZJWE1FOiByZW1vdmUgZGVidWc6Ci0gICAgCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBkaXNwb3NpbmcgbWVzc2FnZS1idW5kbGUgIiArCi0gICAgCQkJCQltYi5nZXRSZXNvdXJjZSgpLmdldFJlc291cmNlTG9jYXRpb25MYWJlbCgpKTsKLSAgICAJCQkvL2Rpc3JlZ2FyZCBjcmFzaGVzOiB0aGlzIGlzIGEgYmVzdCBlZmZvcnQgdG8gZGlzcG9zZSB0aGluZ3MuCi0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZXNzYWdlcyBidW5kbGUgbWF0Y2hpbmcgZ2l2ZW4gbG9jYWxlLgotICAgICAqIEBwYXJhbSBsb2NhbGUgbG9jYWxlIG9mIGJ1bmRsZSB0byByZXRyZWl2ZQotICAgICAqIEByZXR1cm4gYSBidW5kbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZXNCdW5kbGUgZ2V0TWVzc2FnZXNCdW5kbGUoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICByZXR1cm4gbG9jYWxlQnVuZGxlcy5nZXQobG9jYWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZXNzYWdlcyBidW5kbGUgbWF0Y2hpbmcgZ2l2ZW4gc291cmNlIG9iamVjdC4gIEEgc291cmNlCi0gICAgICogb2JqZWN0IGJlaW5nIGEgY29udGV4dC1zcGVjaWZpYyBjb25jcmV0ZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIGEKLSAgICAgKiA8Y29kZT5NZXNzYWdlc0J1bmRsZTwvY29kZT4gYXMgcGVyIGRlZmluZWQgaW4KLQkgKiA8Y29kZT5JTWVzc2FnZVJlc291cmNlPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugb2JqZWN0IHRvIG1hdGNoCi0gICAgICogQHJldHVybiBhIG1lc3NhZ2VzIGJ1bmRsZQotICAgICAqIEBzZWUgSU1lc3NhZ2VzUmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZXNCdW5kbGUgZ2V0TWVzc2FnZXNCdW5kbGUoT2JqZWN0IHNvdXJjZSkgewotICAgIAlmb3IgKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlIDogZ2V0TWVzc2FnZXNCdW5kbGVzKCkpIHsKLSAgICAgICAgICAgIGlmIChlcXVhbHMoc291cmNlLCBtZXNzYWdlc0J1bmRsZS5nZXRSZXNvdXJjZSgpLmdldFNvdXJjZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlc0J1bmRsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbXB0eSA8Y29kZT5NZXNzYWdlc0J1bmRsZTwvY29kZT4gdG8gdGhpcyBncm91cCBmb3IgdGhlCi0gICAgICogZ2l2ZW4gbG9jYWxlLgotICAgICAqIEBwYXJhbSBsb2NhbGUgbG9jYWxlIGZvciB0aGUgbmV3IGJ1bmRsZSBhZGRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VzQnVuZGxlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgYWRkTWVzc2FnZXNCdW5kbGUoZ3JvdXBTdHJhdGVneS5jcmVhdGVNZXNzYWdlc0J1bmRsZShsb2NhbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCBsb2NhbGVzIG1ha2luZyB1cCB0aGlzIG1lc3NhZ2VzIGJ1bmRsZSBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYWxlW10gZ2V0TG9jYWxlcygpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsZUJ1bmRsZXMua2V5U2V0KCkudG9BcnJheShFTVBUWV9MT0NBTEVTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCBtZXNzYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2Uga2V5LgotICAgICAqIEBwYXJhbSBrZXkgYSBtZXNzYWdlIGtleQotICAgICAqIEByZXR1cm4gbWVzc2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZVtdIGdldE1lc3NhZ2VzKFN0cmluZyBrZXkpIHsKLSAgICAgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZT4oKTsKLSAgICAJZm9yIChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSA6IGdldE1lc3NhZ2VzQnVuZGxlcygpKSB7Ci0gICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlc0J1bmRsZS5nZXRNZXNzYWdlKGtleSk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlcy50b0FycmF5KEVNUFRZX01FU1NBR0VTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZXNzYWdlIG1hdGNoaW5nIGdpdmVuIGtleSBhbmQgbG9jYWxlLgotICAgICAqIEBwYXJhbSBsb2NhbGUgbG9jYWxlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgbWVzc2FnZQotICAgICAqIEBwYXJhbSBrZXkga2V5IG1hdGNoaW5nIGVudHJ5IHRvIHJldHJpZXZlIHRoZSBtZXNzYWdlCi0gICAgICogQHJldHVybiBhIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUgPSBnZXRNZXNzYWdlc0J1bmRsZShsb2NhbGUpOwotICAgICAgICBpZiAobWVzc2FnZXNCdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzQnVuZGxlLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbWVzc2FnZXMgYnVuZGxlIHRvIHRoaXMgZ3JvdXAuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VzQnVuZGxlIGJ1bmRsZSB0byBhZGQKLSAgICAgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24gaWYgYSBtZXNzYWdlcyBidW5kbGUgZm9yIHRoZSBzYW1lIGxvY2FsZQotICAgICAqICAgICAgICAgYWxyZWFkeSBleGlzdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZXNCdW5kbGUoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpIHsKLSAgICAgICAgaWYgKGxvY2FsZUJ1bmRsZXMuZ2V0KG1lc3NhZ2VzQnVuZGxlLmdldExvY2FsZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgIkEgYnVuZGxlIHdpdGggdGhlIHNhbWUgbG9jYWxlIGFscmVhZHkgZXhpc3RzLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBvbGRCdW5kbGVDb3VudCA9IGxvY2FsZUJ1bmRsZXMuc2l6ZSgpOwotICAgICAgICBsb2NhbGVCdW5kbGVzLnB1dChtZXNzYWdlc0J1bmRsZS5nZXRMb2NhbGUoKSwgbWVzc2FnZXNCdW5kbGUpOwotICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUEVSVFlfTUVTU0FHRVNfQlVORExFX0NPVU5ULAotICAgICAgICAgICAgICAgIG9sZEJ1bmRsZUNvdW50LCBsb2NhbGVCdW5kbGVzLnNpemUoKSk7Ci0gICAgICAgIGZpcmVNZXNzYWdlc0J1bmRsZUFkZGVkKG1lc3NhZ2VzQnVuZGxlKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIGJ1bmRsZUtleXMgPSBtZXNzYWdlc0J1bmRsZS5nZXRLZXlzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlS2V5cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGtleSA9IGJ1bmRsZUtleXNbaV07Ci0gICAgICAgICAgICBpZiAoIWtleXMuY29udGFpbnMoa2V5KSkgewotICAgICAgICAgICAgICAgIGludCBvbGRLZXlDb3VudCA9IGtleXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGtleXMuYWRkKGtleSk7Ci0gICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfS0VZX0NPVU5ULCBvbGRLZXlDb3VudCwga2V5cy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZpcmVLZXlBZGRlZChrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2VzQnVuZGxlLmFkZE1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIobWVzc2FnZXNCdW5kbGVMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGlzIG1lc3NhZ2VzIGJ1bmRsZSBncm91cCBuYW1lLgotICAgICAqIEByZXR1cm4gYnVuZGxlIGdyb3VwIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGVtcHR5IG1lc3NhZ2UgdG8gZXZlcnkgbWVzc2FnZXMgYnVuZGxlIG9mIHRoaXMgZ3JvdXAgd2l0aCB0aGUKLSAgICAgKiBnaXZlbi4KLSAgICAgKiBAcGFyYW0ga2V5IG1lc3NhZ2Uga2V5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZXMoU3RyaW5nIGtleSkgewotICAgICAgICBmb3IgKE1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IGxvY2FsZUJ1bmRsZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgCW1zZ0J1bmRsZS5hZGRNZXNzYWdlKGtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW5hbWVzIGEga2V5IGluIGFsbCBtZXNzYWdlcyBidW5kbGVzIGZvcm1pbmcgdGhpcyBncm91cC4KLSAgICAgKiBAcGFyYW0gc291cmNlS2V5IHRoZSBtZXNzYWdlIGtleSB0byByZW5hbWUKLSAgICAgKiBAcGFyYW0gdGFyZ2V0S2V5IHRoZSBuZXcgbWVzc2FnZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVuYW1lTWVzc2FnZUtleXMoU3RyaW5nIHNvdXJjZUtleSwgU3RyaW5nIHRhcmdldEtleSkgewotICAgICAgICBmb3IgKE1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IGxvY2FsZUJ1bmRsZXMudmFsdWVzKCkpIHsKLSAgICAgICAgCW1zZ0J1bmRsZS5yZW5hbWVNZXNzYWdlS2V5KAotICAgICAgICAgICAgCQlzb3VyY2VLZXksIHRhcmdldEtleSk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBtZXNzYWdlcyBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5IGZyb20gYWxsIG1lc3NhZ2VzIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5IGtleSBvZiBtZXNzYWdlcyB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlcyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIGZvciAoTWVzc2FnZXNCdW5kbGUgbXNnQnVuZGxlIDogbG9jYWxlQnVuZGxlcy52YWx1ZXMoKSkgewotICAgICAgICAJbXNnQnVuZGxlLnJlbW92ZU1lc3NhZ2Uoa2V5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgbWVzc2FnZXMgbWF0Y2hpbmcgdGhlIDxjb2RlPmtleTwvY29kZT4gYXJlIGFjdGl2ZSBvciBub3QuCi0gICAgICogQHBhcmFtIGtleSBrZXkgb2YgbWVzc2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlc0FjdGl2ZShTdHJpbmcga2V5LCBib29sZWFuIGFjdGl2ZSkgewotICAgICAgICBmb3IgKE1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IGxvY2FsZUJ1bmRsZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgZW50cnkgPSBtc2dCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOwotICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRBY3RpdmUoYWN0aXZlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEdXBsaWNhdGVzIGVhY2ggbWVzc2FnZXMgbWF0Y2hpbmcgdGhlIDxjb2RlPnNvdXJjZUtleTwvY29kZT4gdG8KLSAgICAgKiB0aGUgPGNvZGU+bmV3S2V5PC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gc291cmNlS2V5IG9yaWdpbmFsIGtleQotICAgICAqIEBwYXJhbSB0YXJnZXRLZXkgbmV3IGtleQotICAgICAqIEB0aHJvd3MgTWVzc2FnZUV4Y2VwdGlvbiBpZiBhIHRhcmdldCBrZXkgYWxyZWFkeSBleGlzdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkdXBsaWNhdGVNZXNzYWdlcyhTdHJpbmcgc291cmNlS2V5LCBTdHJpbmcgdGFyZ2V0S2V5KSB7Ci0gICAgICAgIGlmIChzb3VyY2VLZXkuZXF1YWxzKHRhcmdldEtleSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IGxvY2FsZUJ1bmRsZXMudmFsdWVzKCkpIHsKLSAgICAgICAgCW1zZ0J1bmRsZS5kdXBsaWNhdGVNZXNzYWdlKAotICAgICAgICAgICAgCQlzb3VyY2VLZXksIHRhcmdldEtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgYWxsIGJ1bmRsZXMgaW4gdGhpcyBncm91cC4KLSAgICAgKiBAcmV0dXJuIHRoZSBidW5kbGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxNZXNzYWdlc0J1bmRsZT4gZ2V0TWVzc2FnZXNCdW5kbGVzKCkgewotICAgICAgICByZXR1cm4gbG9jYWxlQnVuZGxlcy52YWx1ZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwga2V5cyBmcm9tIGFsbCBtZXNzYWdlcyBidW5kbGVzLgotICAgICAqIEByZXR1cm4gYWxsIGtleXMgZnJvbSBhbGwgbWVzc2FnZXMgYnVuZGxlcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNZXNzYWdlS2V5cygpIHsKLSAgICAgICAgcmV0dXJuIGtleXMudG9BcnJheShCYWJlbFV0aWxzLkVNUFRZX1NUUklOR1MpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBnaXZlbiBrZXkgaXMgZm91bmQgaW4gdGhpcyBtZXNzYWdlcyBidW5kbGUgZ3JvdXAuCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBrZXkgZXhpc3RzIGluIHRoaXMgYnVuZGxlIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWVzc2FnZUtleShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBrZXlzLmNvbnRhaW5zKGtleSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBidW5kbGVzIGluIHRoaXMgZ3JvdXAuCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGJ1bmRsZXMgaW4gdGhpcyBncm91cAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWVzc2FnZXNCdW5kbGVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsZUJ1bmRsZXMuc2l6ZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTWVzc2FnZXNCdW5kbGVHcm91cCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXAgPSAoTWVzc2FnZXNCdW5kbGVHcm91cCkgb2JqOwotICAgICAgICByZXR1cm4gZXF1YWxzKGxvY2FsZUJ1bmRsZXMsIG1lc3NhZ2VzQnVuZGxlR3JvdXAubG9jYWxlQnVuZGxlcyk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgYWRkTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyKAotICAgICAgICAgICAgZmluYWwgSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcigKLSAgICAgICAgICAgIGZpbmFsIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICAgIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcltdIAotICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcnMoKSB7Ci0gICAgICAgIC8vVE9ETyBmaW5kIG1vcmUgZWZmaWNpZW50IHdheSB0byBhdm9pZCBjbGFzcyBjYXN0LgotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpKS50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgRU1QVFlfR1JPVVBfTElTVEVORVJTKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVLZXlBZGRlZChTdHJpbmcga2V5KSB7Ci0gICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPQotICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBsaXN0ZW5lci5rZXlBZGRlZChrZXkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBmaXJlS2V5UmVtb3ZlZChTdHJpbmcga2V5KSB7Ci0gICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPQotICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBsaXN0ZW5lci5rZXlSZW1vdmVkKGtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGZpcmVNZXNzYWdlc0J1bmRsZUFkZGVkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlKSB7Ci0gICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPQotICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBsaXN0ZW5lci5tZXNzYWdlc0J1bmRsZUFkZGVkKG1lc3NhZ2VzQnVuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgZmlyZU1lc3NhZ2VzQnVuZGxlUmVtb3ZlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgewotICAgICAgICBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyW10gbGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICBnZXRNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwotICAgICAgICAgICAgbGlzdGVuZXIubWVzc2FnZXNCdW5kbGVSZW1vdmVkKG1lc3NhZ2VzQnVuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGFzcyBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgaW4gdW5kZXJseWluZyBtZXNzYWdlcyBidW5kbGUgYW5kIAotICAgICAqIHJlbGF5cyB0aGVtIHRvIHRoZSBsaXN0ZW5lcnMgZm9yIE1lc3NhZ2VzQnVuZGxlR3JvdXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBNZXNzYWdlc0J1bmRsZUxpc3RlbmVyIGltcGxlbWVudHMgSU1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlQWRkZWQoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUsCi0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBpbnQgb2xkQ291bnQgPSBrZXlzLnNpemUoKTsKLSAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPQotICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIubWVzc2FnZUFkZGVkKG1lc3NhZ2VzQnVuZGxlLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TWVzc2FnZXMobWVzc2FnZS5nZXRLZXkoKSkubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5cy5hZGQobWVzc2FnZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9LRVlfQ09VTlQsIG9sZENvdW50LCBrZXlzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcmVLZXlBZGRlZChtZXNzYWdlLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlbW92ZWQoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUsCi0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBpbnQgb2xkQ291bnQgPSBrZXlzLnNpemUoKTsKLSAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPQotICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIubWVzc2FnZVJlbW92ZWQobWVzc2FnZXNCdW5kbGUsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGludCBrZXlNZXNzYWdlc0NvdW50ID0gZ2V0TWVzc2FnZXMobWVzc2FnZS5nZXRLZXkoKSkubGVuZ3RoOwotICAgICAgICAgICAgICAgIGlmIChrZXlNZXNzYWdlc0NvdW50ID09IDAgJiYga2V5cy5jb250YWlucyhtZXNzYWdlLmdldEtleSgpKSkgewotICAgICAgICAgICAgICAgICAgICBrZXlzLnJlbW92ZShtZXNzYWdlLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRZX0tFWV9DT1VOVCwgb2xkQ291bnQsIGtleXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyZUtleVJlbW92ZWQobWVzc2FnZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VDaGFuZ2VkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlLAotICAgICAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2hhbmdlRXZlbnQpIHsKLSAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPQotICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIubWVzc2FnZUNoYW5nZWQobWVzc2FnZXNCdW5kbGUsIGNoYW5nZUV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBNZXNzYWdlc0J1bmRsZSBwcm9wZXJ0eSBjaGFuZ2VzOgotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgewotICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGUgYnVuZGxlID0gKE1lc3NhZ2VzQnVuZGxlKSBldnQuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyW10gbGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwotICAgICAgICAgICAgICAgIGxpc3RlbmVyLm1lc3NhZ2VzQnVuZGxlQ2hhbmdlZChidW5kbGUsIGV2dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvTWVzc2FnZXNCdW5kbGVHcm91cEFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9NZXNzYWdlc0J1bmRsZUdyb3VwQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTAwZTcyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9NZXNzYWdlc0J1bmRsZUdyb3VwQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQW4gYWRhcHRlciBjbGFzcyBmb3IgYSB7QGxpbmsgSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcn0uICBNZXRob2RzIAotICogaW1wbGVtZW50YXRpb24gZG8gbm90aGluZy4KLSAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZSAocGFzY2FsQGVzc2llbWJyZS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlc0J1bmRsZUdyb3VwQWRhcHRlcgotICAgICAgICBpbXBsZW1lbnRzIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIjCi0gICAgICogICAgICAgICAgICAgIGtleUFkZGVkKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQga2V5QWRkZWQoU3RyaW5nIGtleSkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIjCi0gICAgICogICAgICAgICAgICAgIGtleVJlbW92ZWQoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBrZXlSZW1vdmVkKFN0cmluZyBrZXkpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyIwotICAgICAqICAgICAgbWVzc2FnZXNCdW5kbGVBZGRlZChvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZXNCdW5kbGVBZGRlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIjCi0gICAgICogICAgICBtZXNzYWdlc0J1bmRsZUNoYW5nZWQob3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXNzYWdlc0J1bmRsZUNoYW5nZWQoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUsCi0gICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcgotICAgICAqICAgICAjbWVzc2FnZXNCdW5kbGVSZW1vdmVkKG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXNzYWdlc0J1bmRsZVJlbW92ZWQoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGVMaXN0ZW5lciNtZXNzYWdlQWRkZWQoCi0gICAgICogICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZSwKLSAgICAgKiAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZUFkZGVkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlLCBNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGVMaXN0ZW5lciMKLSAgICAgKiAgICAgIG1lc3NhZ2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXNzYWdlQ2hhbmdlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSwKLSAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2hhbmdlRXZlbnQpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGVMaXN0ZW5lciMKLSAgICAgKiAgICAgIG1lc3NhZ2VSZW1vdmVkKG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZW1vdmVkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlLCBNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZSgKLSAgICAgKiAgICAgICAgICAgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvY2hlY2tzL0lNZXNzYWdlQ2hlY2suamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvSU1lc3NhZ2VDaGVjay5qYXZhCmluZGV4IDc2NGFhNjUuLjYyNTg2MzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvSU1lc3NhZ2VDaGVjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvSU1lc3NhZ2VDaGVjay5qYXZhCkBAIC0xMCw4ICsxMCwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CiAKIC8qKgogICogQWxsIHB1cnBvc2Uge0BsaW5rIE1lc3NhZ2V9IHRlc3RpbmcuICAgVXNlIHRoaXMgaW50ZXJmYWNlIHRvIGVzdGFibGlzaCAKQEAgLTI3LDUgKzI5LDUgQEAKIAkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBiZWluZyB0ZXN0ZWQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbmRpdGlvbiBpcyBzdWNjZXNzZnVsbHkgdGVzdGVkCiAJICovCi0gICAgYm9vbGVhbiBjaGVja0tleShNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXAsIE1lc3NhZ2UgbWVzc2FnZSk7CisgICAgYm9vbGVhbiBjaGVja0tleShJTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwLCBJTWVzc2FnZSBtZXNzYWdlKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvRHVwbGljYXRlVmFsdWVDaGVjay5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2NoZWNrcy9pbnRlcm5hbC9EdXBsaWNhdGVWYWx1ZUNoZWNrLmphdmEKc2ltaWxhcml0eSBpbmRleCA3OSUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2NoZWNrcy9EdXBsaWNhdGVWYWx1ZUNoZWNrLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvaW50ZXJuYWwvRHVwbGljYXRlVmFsdWVDaGVjay5qYXZhCmluZGV4IDA1MWI0YTcuLjJjZjk2ZGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvRHVwbGljYXRlVmFsdWVDaGVjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvaW50ZXJuYWwvRHVwbGljYXRlVmFsdWVDaGVjay5qYXZhCkBAIC04LDE0ICs4LDE1IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5JTWVzc2FnZUNoZWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbC5CYWJlbFV0aWxzOwogCiAvKioKQEAgLTQxLDEyICs0MiwxMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGNoZWNrS2V5KAotICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwLCBNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXAsIElNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUgPQorICAgICAgICAgICAgSU1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlID0KICAgICAgICAgICAgIAkJbWVzc2FnZXNCdW5kbGVHcm91cC5nZXRNZXNzYWdlc0J1bmRsZShtZXNzYWdlLmdldExvY2FsZSgpKTsKLSAgICAgICAgICAgIGZvciAoTWVzc2FnZSBkdXBsaWNhdGVFbnRyeSA6IG1lc3NhZ2VzQnVuZGxlLmdldE1lc3NhZ2VzKCkpIHsKKyAgICAgICAgICAgIGZvciAoSU1lc3NhZ2UgZHVwbGljYXRlRW50cnkgOiBtZXNzYWdlc0J1bmRsZS5nZXRNZXNzYWdlcygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLmdldEtleSgpLmVxdWFscyhkdXBsaWNhdGVFbnRyeS5nZXRLZXkoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBCYWJlbFV0aWxzLmVxdWFscyhtZXNzYWdlLmdldFZhbHVlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVFbnRyeS5nZXRWYWx1ZSgpKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2NoZWNrcy9NaXNzaW5nVmFsdWVDaGVjay5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2NoZWNrcy9pbnRlcm5hbC9NaXNzaW5nVmFsdWVDaGVjay5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvTWlzc2luZ1ZhbHVlQ2hlY2suamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2NoZWNrcy9pbnRlcm5hbC9NaXNzaW5nVmFsdWVDaGVjay5qYXZhCmluZGV4IDdjNzljNTYuLmU1YTUyOTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvTWlzc2luZ1ZhbHVlQ2hlY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvY2hlY2tzL2ludGVybmFsL01pc3NpbmdWYWx1ZUNoZWNrLmphdmEKQEAgLTgsMTAgKzgsMTEgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3M7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MuaW50ZXJuYWw7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MuSU1lc3NhZ2VDaGVjazsKIAogLyoqCiAgKiBWaXNpdG9yIGZvciBmaW5kaW5nIGlmIGEga2V5IGhhcyBhdCBsZWFzdCBvbmUgY29ycmVzcG9uZGluZyBidW5kbGUgZW50cnkKQEAgLTMxLDEyICszMiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5JTWVzc2FnZUNoZWNrI2NoZWNrS2V5KAotICAgICAqIAkgICAgICAgIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwLAotICAgICAqIAkJICAgIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLmNoZWNrcy5JTWVzc2FnZUNoZWNrI2NoZWNrS2V5KAorICAgICAqIAkgICAgICAgIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZUdyb3VwLAorICAgICAqIAkJICAgIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNoZWNrS2V5KAotICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwLCBNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXAsIElNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmdldFZhbHVlKCkgPT0gbnVsbAogICAgICAgICAgICAgICAgIHx8IG1lc3NhZ2UuZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvU2ltaWxhclZhbHVlQ2hlY2suamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvaW50ZXJuYWwvU2ltaWxhclZhbHVlQ2hlY2suamF2YQpzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvY2hlY2tzL1NpbWlsYXJWYWx1ZUNoZWNrLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9jaGVja3MvaW50ZXJuYWwvU2ltaWxhclZhbHVlQ2hlY2suamF2YQppbmRleCA5OTg2Y2Y3Li5iZTMzM2NhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvY2hlY2tzL1NpbWlsYXJWYWx1ZUNoZWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2NoZWNrcy9pbnRlcm5hbC9TaW1pbGFyVmFsdWVDaGVjay5qYXZhCkBAIC04LDE0ICs4LDE1IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5JTWVzc2FnZUNoZWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MucHJveGltaXR5LklQcm94aW1pdHlBbmFseXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWwuQmFiZWxVdGlsczsKIApAQCAtMzgsMTkgKzM5LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLklNZXNzYWdlQ2hlY2sjY2hlY2tLZXkoCi0gICAgICogCQkJb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXAsCi0gICAgICoJCQlvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZSkKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5jaGVja3MuSU1lc3NhZ2VDaGVjayNjaGVja0tleSgKKyAgICAgKiAJCQlvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGVHcm91cCwKKyAgICAgKgkJCW9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNoZWNrS2V5KAotICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwLCBNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXAsIElNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICAgICAgICAgLy9UT0RPIGhhdmUgY2FzZSBhcyBwcmVmZXJlbmNlCiAgICAgICAgICAgICBTdHJpbmcgdmFsdWUxID0gbWVzc2FnZS5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICBNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSA9CisgICAgICAgICAgICBJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUgPQogICAgICAgICAgICAgCQltZXNzYWdlc0J1bmRsZUdyb3VwLmdldE1lc3NhZ2VzQnVuZGxlKG1lc3NhZ2UuZ2V0TG9jYWxlKCkpOwotICAgICAgICAgICAgZm9yIChNZXNzYWdlIHNpbWlsYXJFbnRyeSA6IG1lc3NhZ2VzQnVuZGxlLmdldE1lc3NhZ2VzKCkpIHsKKyAgICAgICAgICAgIGZvciAoSU1lc3NhZ2Ugc2ltaWxhckVudHJ5IDogbWVzc2FnZXNCdW5kbGUuZ2V0TWVzc2FnZXMoKSkgewogICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZS5nZXRLZXkoKS5lcXVhbHMoc2ltaWxhckVudHJ5LmdldEtleSgpKSkgewogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUyID0gc2ltaWxhckVudHJ5LmdldFZhbHVlKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGhhdmUgcHJlZmVyZW5jZSB0byByZXBvcnQgaWRlbnRpY2FsIGFzIHNpbWlsYXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9BYnN0cmFjdElGaWxlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9BYnN0cmFjdElGaWxlQ2hhbmdlTGlzdGVuZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvQWJzdHJhY3RJRmlsZUNoYW5nZUxpc3RlbmVyLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9BYnN0cmFjdElGaWxlQ2hhbmdlTGlzdGVuZXIuamF2YQppbmRleCBmNzUxZTY5Li44MzE3OWM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvQWJzdHJhY3RJRmlsZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL0Fic3RyYWN0SUZpbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCkBAIC04LDcgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9BYnN0cmFjdE1lc3NhZ2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL0Fic3RyYWN0TWVzc2FnZU1vZGVsLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL0Fic3RyYWN0TWVzc2FnZU1vZGVsLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9BYnN0cmFjdE1lc3NhZ2VNb2RlbC5qYXZhCmluZGV4IDE5YTQxMGQuLmVlNTA3MTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9BYnN0cmFjdE1lc3NhZ2VNb2RlbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9BYnN0cmFjdE1lc3NhZ2VNb2RlbC5qYXZhCkBAIC03LDE0ICs3LDE2IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgQWxleGVqIFN0cmVsem93IC0gVGFwSkkgaW50ZWdyYXRpb24gLT4gRGlydHlIYWNrCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7CiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLmNvbmZpZ3VyYXRpb24uRGlydHlIYWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbC5CYWJlbFV0aWxzOwogCiAKQEAgLTk1LDcgKzk3LDcgQEAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCiAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2xkVmFsdWUsCiAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgaWYgKGNoYW5nZVN1cHBvcnQgPT0gbnVsbCkgeworICAgICAgICBpZiAoY2hhbmdlU3VwcG9ydCA9PSBudWxsIHx8ICFEaXJ0eUhhY2suaXNGaXJlRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2hhbmdlU3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwpAQCAtMTE1LDcgKzExNyw3IEBACiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBvbGRWYWx1ZSwKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLSAgICAgICAgaWYgKGNoYW5nZVN1cHBvcnQgPT0gbnVsbCkgeworICAgICAgICBpZiAoY2hhbmdlU3VwcG9ydCA9PSBudWxsIHx8ICFEaXJ0eUhhY2suaXNGaXJlRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2hhbmdlU3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwpAQCAtMTMxLDcgKzEzMyw3IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKAogICAgICAgICAgICAgZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBpZiAoY2hhbmdlU3VwcG9ydCA9PSBudWxsKSB7CisgICAgICAgIGlmIChjaGFuZ2VTdXBwb3J0ID09IG51bGwgfHwgIURpcnR5SGFjay5pc0ZpcmVFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjaGFuZ2VTdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZShldmVudCk7CkBAIC0xODcsNyArMTg5LDcgQEAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCiAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkVmFsdWUsCiAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3VmFsdWUpIHsKLSAgICAgICAgaWYgKGNoYW5nZVN1cHBvcnQgPT0gbnVsbCkgeworICAgICAgICBpZiAoY2hhbmdlU3VwcG9ydCA9PSBudWxsIHx8ICFEaXJ0eUhhY2suaXNGaXJlRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2hhbmdlU3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL0lNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9JTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL0lNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL0lNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIuamF2YQppbmRleCAwYTg1ZmJhLi43ZmI5N2M1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9JTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyLmphdmEKQEAgLTgsNyArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL0lNZXNzYWdlc0J1bmRsZUxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvaW50ZXJuYWwvSU1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvSU1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL0lNZXNzYWdlc0J1bmRsZUxpc3RlbmVyLmphdmEKaW5kZXggOTMyZTJlMy4uMTA4NjAxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL0lNZXNzYWdlc0J1bmRsZUxpc3RlbmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL0lNZXNzYWdlc0J1bmRsZUxpc3RlbmVyLmphdmEKQEAgLTgsNyArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvTWVzc2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvTWVzc2FnZS5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZS5qYXZhCmluZGV4IGEwN2Y4OTQuLjkwZWFjNDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9NZXNzYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2UuamF2YQpAQCAtNywxMiArNywxNSBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIEFsZXhlaiBTdHJlbHpvdyAtIFRhcEpJIGludGVncmF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlOworCiAvKioKICAqIEEgc2luZ2xlIGVudHJ5IGluIGEgPGNvZGU+TWVzc2FnZXNCdW5kbGU8L2NvZGU+LgogICogCkBAIC0yMCw3ICsyMyw3IEBACiAgKiBAc2VlIE1lc3NhZ2VzQnVuZGxlCiAgKiBAc2VlIE1lc3NhZ2VzQnVuZGxlR3JvdXAKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VNb2RlbCB7CitwdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnZSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZU1vZGVsIGltcGxlbWVudHMgSU1lc3NhZ2UgewogCiAgICAgLyoqIEZvciBzZXJpYWxpc2F0aW9uLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExNjA2NzAzNTEzNDE2NTU0MjdMOwpAQCAtNjIsNiArNjUsMTQgQEAKICAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BFUlRZX0NPTU1FTlQsIG9sZFZhbHVlLCBjb21tZW50KTsKICAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCwgYm9vbGVhbiBzaWxlbnQpIHsKKyAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OworICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OworICAgICAgICBpZiAoIXNpbGVudCkgeworICAgICAgICAJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BFUlRZX0NPTU1FTlQsIG9sZFZhbHVlLCBjb21tZW50KTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhY3RpdmUgb3Igbm90LiAgQW4gaW5hY3RpdmUgbWVzc2FnZSBpcwpAQCAtODYsNiArOTcsMTQgQEAKICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BFUlRZX1RFWFQsIG9sZFZhbHVlLCB0ZXh0KTsKICAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCwgYm9vbGVhbiBzaWxlbnQpIHsKKyAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gdGhpcy50ZXh0OworICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICBpZiAoIXNpbGVudCkgeworICAgICAgICAJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BFUlRZX1RFWFQsIG9sZFZhbHVlLCB0ZXh0KTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZSAoPGNvZGU+bnVsbDwvY29kZT4gaWYKQEAgLTEzMyw3ICsxNTIsNyBAQAogICAgICAqIG1lc3NhZ2Uga2V5IGFuZCBsb2NhbGUuCiAgICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbShJTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgIHNldENvbW1lbnQobWVzc2FnZS5nZXRDb21tZW50KCkpOwogICAgICAgICBzZXRBY3RpdmUobWVzc2FnZS5pc0FjdGl2ZSgpKTsKICAgICAgICAgc2V0VGV4dChtZXNzYWdlLmdldFZhbHVlKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL01lc3NhZ2VFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL01lc3NhZ2VFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2VFeGNlcHRpb24uamF2YQppbmRleCAwMDgzNzQ3Li4yNDJiOTAyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvTWVzc2FnZUV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEKQEAgLTgsNyArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKIAogLyoqCiAgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBtZXNzYWdlLXJlbGF0ZWQgb3BlcmF0aW9uIHJhaXNlZCBhIHByb2JsZW0uIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL01lc3NhZ2VzQnVuZGxlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZXNCdW5kbGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvTWVzc2FnZXNCdW5kbGUuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2VzQnVuZGxlLmphdmEKaW5kZXggMWNmNDJjMC4uZWY3ZjI0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL01lc3NhZ2VzQnVuZGxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2VzQnVuZGxlLmphdmEKQEAgLTcsOCArNywxMCBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIEFsZXhlaiBTdHJlbHpvdyAtIFRhcEpJIGludGVncmF0aW9uLCBjb3JyZWN0IGRpc3Bvc2UKKyAqICAgIE1hdHRoaWFzIExldHRtYXllciAtIGFkZGVkIHJlbW92ZU1lc3NhZ2VBZGRQYXJlbnRLZXkoKSAoZml4ZWQgaXNzdWUgNDEpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CkBAIC0xOSw4ICsyMSwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5JTWVzc2FnZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWwuQmFiZWxVdGlsczsKIAogLyoqCkBAIC0yOCw3ICszMiw3IEBACiAgKiBAYXV0aG9yIFBhc2NhbCBFc3NpZW1icmUgKHBhc2NhbEBlc3NpZW1icmUuY29tKQogICovCiBwdWJsaWMgY2xhc3MgTWVzc2FnZXNCdW5kbGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VNb2RlbAotCQlpbXBsZW1lbnRzIElNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIgeworCQlpbXBsZW1lbnRzIElNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElNZXNzYWdlc0J1bmRsZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzMxNTE1MTk2MjI3NDc1NjUyTDsKIApAQCAtMzksNyArNDMsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElNZXNzYWdlc0J1bmRsZUxpc3RlbmVyW10gRU1QVFlfTVNHX0JVTkRMRV9MSVNURU5FUlMgPQogICAgICAgICBuZXcgSU1lc3NhZ2VzQnVuZGxlTGlzdGVuZXJbXSB7fTsKICAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBvcmRlcmVkS2V5cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTWVzc2FnZT4ga2V5ZWRNZXNzYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElNZXNzYWdlPiBrZXllZE1lc3NhZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJTWVzc2FnZT4oKTsKIAogICAgIHByaXZhdGUgZmluYWwgSU1lc3NhZ2VzUmVzb3VyY2UgcmVzb3VyY2U7CiAgICAgCkBAIC04Miw3ICs4Niw3IEBACiAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGlzIG9iamVjdCB3aWxsIGJlIGRpc2NhcmRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIAkKKyAgICAJdGhpcy5yZXNvdXJjZS5kaXNwb3NlKCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTI3LDcgKzEzMSw3IEBACiAgICAgLyoqCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UKICAgICAgKiAJCS5JTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZCgKLSAgICAgKiAJCQkJb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLklNZXNzYWdlc1Jlc291cmNlKQorICAgICAqIAkJCQlvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2UpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElNZXNzYWdlc1Jlc291cmNlIGNoYW5nZWRSZXNvdXJjZSkgewogICAgICAgICB0aGlzLnJlc291cmNlLmRlc2VyaWFsaXplKHRoaXMpOwpAQCAtMTM4LDIxICsxNDIsMjIgQEAKICAgICAgKiBpdHMgcHJvcGVydGllcyBhcmUgdXBkYXRlZCBhbmQgbm8gbmV3IG1lc3NhZ2UgaXMgYWRkZWQuCiAgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgTWVzc2FnZSBtID0gKE1lc3NhZ2UpIG1lc3NhZ2U7CiAgICAgICAgIGludCBvbGRDb3VudCA9IGdldE1lc3NhZ2VzQ291bnQoKTsKLSAgICAgICAgaWYgKCFvcmRlcmVkS2V5cy5jb250YWlucyhtZXNzYWdlLmdldEtleSgpKSkgewotICAgICAgICAgICAgb3JkZXJlZEtleXMuYWRkKG1lc3NhZ2UuZ2V0S2V5KCkpOworICAgICAgICBpZiAoIW9yZGVyZWRLZXlzLmNvbnRhaW5zKG0uZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICBvcmRlcmVkS2V5cy5hZGQobS5nZXRLZXkoKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFrZXllZE1lc3NhZ2VzLmNvbnRhaW5zS2V5KG1lc3NhZ2UuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICBrZXllZE1lc3NhZ2VzLnB1dChtZXNzYWdlLmdldEtleSgpLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYWRkTWVzc2FnZUxpc3RlbmVyKG1lc3NhZ2VMaXN0ZW5lcik7CisgICAgICAgIGlmICgha2V5ZWRNZXNzYWdlcy5jb250YWluc0tleShtLmdldEtleSgpKSkgeworICAgICAgICAgICAga2V5ZWRNZXNzYWdlcy5wdXQobS5nZXRLZXkoKSwgbSk7CisgICAgICAgICAgICBtLmFkZE1lc3NhZ2VMaXN0ZW5lcihtZXNzYWdlTGlzdGVuZXIpOwogICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKAogICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9NRVNTQUdFU19DT1VOVCwgb2xkQ291bnQsIGdldE1lc3NhZ2VzQ291bnQoKSk7Ci0gICAgICAgICAgICBmaXJlTWVzc2FnZUFkZGVkKG1lc3NhZ2UpOworICAgICAgICAgICAgZmlyZU1lc3NhZ2VBZGRlZChtKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEVudHJ5IGFscmVhZHkgZXhpc3RzLCB1cGRhdGUgaXQuCi0gICAgICAgICAgICBNZXNzYWdlIG1hdGNoaW5nRW50cnkgPSBrZXllZE1lc3NhZ2VzLmdldChtZXNzYWdlLmdldEtleSgpKTsKLSAgICAgICAgICAgIG1hdGNoaW5nRW50cnkuY29weUZyb20obWVzc2FnZSk7CisgICAgICAgICAgICBNZXNzYWdlIG1hdGNoaW5nRW50cnkgPSAoTWVzc2FnZSkga2V5ZWRNZXNzYWdlcy5nZXQobS5nZXRLZXkoKSk7CisgICAgICAgICAgICBtYXRjaGluZ0VudHJ5LmNvcHlGcm9tKG0pOwogICAgICAgICB9CiAgICAgfQogICAgIC8qKgpAQCAtMTYyLDcgKzE2Nyw3IEBACiAgICAgcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZShTdHJpbmcgbWVzc2FnZUtleSkgewogICAgICAgICBpbnQgb2xkQ291bnQgPSBnZXRNZXNzYWdlc0NvdW50KCk7CiAgICAgICAgIG9yZGVyZWRLZXlzLnJlbW92ZShtZXNzYWdlS2V5KTsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0ga2V5ZWRNZXNzYWdlcy5nZXQobWVzc2FnZUtleSk7CisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBrZXllZE1lc3NhZ2VzLmdldChtZXNzYWdlS2V5KTsKICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICAgICAgICAgbWVzc2FnZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG1lc3NhZ2VMaXN0ZW5lcik7CiAgICAgICAgICAgICBrZXllZE1lc3NhZ2VzLnJlbW92ZShtZXNzYWdlS2V5KTsKQEAgLTE3MSw2ICsxNzYsMjMgQEAKICAgICAgICAgICAgIGZpcmVNZXNzYWdlUmVtb3ZlZChtZXNzYWdlKTsKICAgICAgICAgfQogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbWVzc2FnZSBmcm9tIHRoaXMgbWVzc2FnZXMgYnVuZGxlIGFuZCBhZGRzIGl0J3MgcGFyZW50IGtleSB0byBidW5kbGUuCisgICAgICogRS5nLjoga2V5ID0gYS5iLmMgZ2V0cyBkZWxldGVkLCBhLmIgZ2V0cyBhZGRlZCB3aXRoIGEgZGVmYXVsdCBtZXNzYWdlCisgICAgICogQHBhcmFtIG1lc3NhZ2VLZXkgdGhlIGtleSBvZiB0aGUgbWVzc2FnZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlQWRkUGFyZW50S2V5KFN0cmluZyBtZXNzYWdlS2V5KSB7CisgICAgCXJlbW92ZU1lc3NhZ2UobWVzc2FnZUtleSk7ICAgCQorICAgICAgICAgICAgCisgICAgICAgIC8vIGFkZCBwYXJlbnQga2V5CisgICAgICAgIGludCBpbmRleCA9IG1lc3NhZ2VLZXkubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgbWVzc2FnZUtleSA9IChpbmRleCA9PSAtMSA/ICIiIDogbWVzc2FnZUtleS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKKyAgICAgICAgCisgICAgICAgIGlmICghIG1lc3NhZ2VLZXkuaXNFbXB0eSgpKQorICAgICAgICAJYWRkTWVzc2FnZShuZXcgTWVzc2FnZShtZXNzYWdlS2V5LCBnZXRMb2NhbGUoKSkpOyAgICAgICAgCisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgbWVzc2FnZXMgZnJvbSB0aGlzIG1lc3NhZ2VzIGJ1bmRsZS4KICAgICAgKiBAcGFyYW0gbWVzc2FnZUtleXMgdGhlIGtleXMgb2YgdGhlIG1lc3NhZ2VzIHRvIHJlbW92ZQpAQCAtMTkyLDcgKzIxNCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbigKICAgICAgICAgICAgIAkJIkNhbm5vdCByZW5hbWU6IHRhcmdldCBrZXkgYWxyZWFkeSBleGlzdHMuIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICBNZXNzYWdlIHNvdXJjZUVudHJ5ID0gZ2V0TWVzc2FnZShzb3VyY2VLZXkpOworICAgICAgICBJTWVzc2FnZSBzb3VyY2VFbnRyeSA9IGdldE1lc3NhZ2Uoc291cmNlS2V5KTsKICAgICAgICAgaWYgKHNvdXJjZUVudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgdGFyZ2V0RW50cnkgPSBuZXcgTWVzc2FnZSh0YXJnZXRLZXksIGdldExvY2FsZSgpKTsKICAgICAgICAgICAgIHRhcmdldEVudHJ5LmNvcHlGcm9tKHNvdXJjZUVudHJ5KTsKQEAgLTIxMSw3ICsyMzMsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24oCiAgICAgICAgICAgICAJIkNhbm5vdCBkdXBsaWNhdGU6IHRhcmdldCBrZXkgYWxyZWFkeSBleGlzdHMuIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICBNZXNzYWdlIHNvdXJjZUVudHJ5ID0gZ2V0TWVzc2FnZShzb3VyY2VLZXkpOworICAgICAgICBJTWVzc2FnZSBzb3VyY2VFbnRyeSA9IGdldE1lc3NhZ2Uoc291cmNlS2V5KTsKICAgICAgICAgaWYgKHNvdXJjZUVudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgdGFyZ2V0RW50cnkgPSBuZXcgTWVzc2FnZSh0YXJnZXRLZXksIGdldExvY2FsZSgpKTsKICAgICAgICAgICAgIHRhcmdldEVudHJ5LmNvcHlGcm9tKHNvdXJjZUVudHJ5KTsKQEAgLTIyNCw3ICsyNDYsNyBAQAogICAgICAqIEBwYXJhbSBrZXkgYSBtZXNzYWdlIGtleQogICAgICAqIEByZXR1cm4gYSBtZXNzYWdlCiAgICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB7CisgICAgcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewogICAgICAgICByZXR1cm4ga2V5ZWRNZXNzYWdlcy5nZXQoa2V5KTsKICAgICB9CiAKQEAgLTI0OCw3ICsyNzAsNyBAQAogICAgICAqIE9idGFpbnMgdGhlIHNldCBvZiA8Y29kZT5NZXNzYWdlPC9jb2RlPiBvYmplY3RzIGluIHRoaXMgYnVuZGxlLgogICAgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPk1lc3NhZ2U8L2NvZGU+IG9iamVjdHMgaW4gdGhpcyBidW5kbGUKICAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxNZXNzYWdlPiBnZXRNZXNzYWdlcygpIHsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxJTWVzc2FnZT4gZ2V0TWVzc2FnZXMoKSB7CiAgICAgICAgIHJldHVybiBrZXllZE1lc3NhZ2VzLnZhbHVlcygpOwogICAgIH0KIApAQCAtMjU5LDcgKzI4MSw3IEBACiAgICAgICAgIFN0cmluZyBzdHIgPSAiTWVzc2FnZXNCdW5kbGU9W1tsb2NhbGU9IiArIGdldExvY2FsZSgpIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICArICJdW2NvbW1lbnQ9IiArIGNvbW1lbnQgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICsgIl1bZW50cmllcz0iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvciAoTWVzc2FnZSBtZXNzYWdlIDogZ2V0TWVzc2FnZXMoKSkgeworICAgICAgICBmb3IgKElNZXNzYWdlIG1lc3NhZ2UgOiBnZXRNZXNzYWdlcygpKSB7CiAgICAgICAgICAgICBzdHIgKz0gbWVzc2FnZS50b1N0cmluZygpOwogICAgICAgICB9CiAgICAgICAgIHN0ciArPSAiXV0iOyAvLyROT04tTkxTLTEkCkBAIC0zNDEsNCArMzYzLDE0IEBACiAgICAgICAgICAgICBsaXN0ZW5lci5tZXNzYWdlQ2hhbmdlZCh0aGlzLCBldmVudCk7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gdGhlIGdpdmVuIGtleSwgaWYgdGhlIGtleSBleGlzdHMuCisgICAgICogT3RoZXJ3aXNlIG1heSB0aHJvdyBhIE5QRS4KKyAgICAgKiBAcGFyYW0ga2V5LCB0aGUga2V5IG9mIGEgbWVzc2FnZS4KKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byB0aGUgZ2l2ZW4ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXkpLmdldFZhbHVlKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL01lc3NhZ2VzQnVuZGxlQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2VzQnVuZGxlQWRhcHRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjglCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9NZXNzYWdlc0J1bmRsZUFkYXB0ZXIuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2VzQnVuZGxlQWRhcHRlci5qYXZhCmluZGV4IDdiZDA0ZTUuLmQzM2Q2YzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9NZXNzYWdlc0J1bmRsZUFkYXB0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZXNCdW5kbGVBZGFwdGVyLmphdmEKQEAgLTgsNyArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKIApAQCAtMjAsMTYgKzIwLDE2IEBACiBwdWJsaWMgY2xhc3MgTWVzc2FnZXNCdW5kbGVBZGFwdGVyIGltcGxlbWVudHMgSU1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIgewogCiAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIjbWVzc2FnZUFkZGVkKAotICAgICAqICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGUsCi0gICAgICogICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLklNZXNzYWdlc0J1bmRsZUxpc3RlbmVyI21lc3NhZ2VBZGRlZCgKKyAgICAgKiAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlLAorICAgICAqICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZSkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlQWRkZWQoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUsIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAvLyBkbyBub3RoaW5nCiAgICAgfQogICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUxpc3RlbmVyCi0gICAgICogICAgICAjbWVzc2FnZUNoYW5nZWQob3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlLAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLklNZXNzYWdlc0J1bmRsZUxpc3RlbmVyCisgICAgICogICAgICAjbWVzc2FnZUNoYW5nZWQob3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlLAogICAgICAqICAgICAgICAgICAgICAgICAgICAgIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudCkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlQ2hhbmdlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSwKQEAgLTM3LDkgKzM3LDkgQEAKICAgICAgICAgLy8gZG8gbm90aGluZwogICAgIH0KICAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGVMaXN0ZW5lcgotICAgICAqICAgICAgI21lc3NhZ2VSZW1vdmVkKG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZSkKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5JTWVzc2FnZXNCdW5kbGVMaXN0ZW5lcgorICAgICAqICAgICAgI21lc3NhZ2VSZW1vdmVkKG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZSkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVtb3ZlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgIC8vIGRvIG5vdGhpbmcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlc0J1bmRsZUdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZXNCdW5kbGVHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYzEwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZXNCdW5kbGVHcm91cC5qYXZhCkBAIC0wLDAgKzEsNjE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFBhc2NhbCBFc3NpZW1icmUuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIEFsZXhlaiBTdHJlbHpvdyAtIFRhcEpJIGludGVncmF0aW9uCisgKiAgICBNYXR0aGlhcyBMZXR0bWF5ZXIgLSBhZGRlZCByZW1vdmVNZXNzYWdlc0FkZFBhcmVudEtleSgpIChmaXhlZCBpc3N1ZSA0MSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLm1hbmFnZXIuUkJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5JTWVzc2FnZXNSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2Uuc3RyYXRlZ3kuSU1lc3NhZ2VzQnVuZGxlR3JvdXBTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2Uuc3RyYXRlZ3kuUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbC5CYWJlbFV0aWxzOworCisvKioKKyAqIEdyb3VwaW5nIG9mIGFsbCBtZXNzYWdlcyBidW5kbGUgb2YgdGhlIHNhbWUga2luZC4KKyAqIAorICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlIChwYXNjYWxAZXNzaWVtYnJlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzQnVuZGxlR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VNb2RlbCBpbXBsZW1lbnRzCisJSU1lc3NhZ2VzQnVuZGxlR3JvdXAgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyW10gRU1QVFlfR1JPVVBfTElTVEVORVJTID0gbmV3IElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSB7fTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlW10gRU1QVFlfTUVTU0FHRVMgPSBuZXcgTWVzc2FnZVtdIHt9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTUVTU0FHRVNfQlVORExFX0NPVU5UID0gIm1lc3NhZ2VzQnVuZGxlQ291bnQiOyAvLyROT04tTkxTLTEkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfS0VZX0NPVU5UID0gImtleUNvdW50IjsgLy8kTk9OLU5MUy0xJAorCisgICAgLyoqIEZvciBzZXJpYWxpemF0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xOTc3ODQ5NTM0MTkxMzg0MzI0TDsKKyAgICAvKiogQnVuZGxlcyBmb3JtaW5nIHRoZSBncm91cCAoa2V5PUxvY2FsZTsgdmFsdWU9TWVzc2FnZXNCdW5kbGUpLiAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPExvY2FsZSwgSU1lc3NhZ2VzQnVuZGxlPiBsb2NhbGVCdW5kbGVzID0gbmV3IEhhc2hNYXA8TG9jYWxlLCBJTWVzc2FnZXNCdW5kbGU+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBrZXlzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgZmluYWwgSU1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIgbWVzc2FnZXNCdW5kbGVMaXN0ZW5lciA9IG5ldyBNZXNzYWdlc0J1bmRsZUxpc3RlbmVyKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIElNZXNzYWdlc0J1bmRsZUdyb3VwU3RyYXRlZ3kgZ3JvdXBTdHJhdGVneTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGVbXSBFTVBUWV9MT0NBTEVTID0gbmV3IExvY2FsZVtdIHt9OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VCdW5kbGVJZDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZXMgYnVuZGxlIGdyb3VwLgorICAgICAqIAorICAgICAqIEBwYXJhbSBncm91cFN0cmF0ZWd5CisgICAgICogICAgICAgICAgICBhIElNZXNzYWdlc0J1bmRsZUdyb3VwU3RyYXRlZ3kgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZXNCdW5kbGVHcm91cChJTWVzc2FnZXNCdW5kbGVHcm91cFN0cmF0ZWd5IGdyb3VwU3RyYXRlZ3kpIHsKKwlzdXBlcigpOworCXRoaXMuZ3JvdXBTdHJhdGVneSA9IGdyb3VwU3RyYXRlZ3k7CisJdGhpcy5uYW1lID0gZ3JvdXBTdHJhdGVneS5jcmVhdGVNZXNzYWdlc0J1bmRsZUdyb3VwTmFtZSgpOworCXRoaXMucmVzb3VyY2VCdW5kbGVJZCA9IGdyb3VwU3RyYXRlZ3kuY3JlYXRlTWVzc2FnZXNCdW5kbGVJZCgpOworCisJdGhpcy5wcm9qZWN0TmFtZSA9IGdyb3VwU3RyYXRlZ3kuZ2V0UHJvamVjdE5hbWUoKTsKKworCU1lc3NhZ2VzQnVuZGxlW10gYnVuZGxlcyA9IGdyb3VwU3RyYXRlZ3kubG9hZE1lc3NhZ2VzQnVuZGxlcygpOworCWlmIChidW5kbGVzICE9IG51bGwpIHsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7CisJCWFkZE1lc3NhZ2VzQnVuZGxlKGJ1bmRsZXNbaV0pOworCSAgICB9CisJfQorCisJaWYgKHRoaXMucHJvamVjdE5hbWUgIT0gbnVsbCkgeworCSAgICBSQk1hbmFnZXIuZ2V0SW5zdGFuY2UodGhpcy5wcm9qZWN0TmFtZSkKKwkJICAgIC5ub3RpZnlNZXNzYWdlc0J1bmRsZUdyb3VwQ3JlYXRlZCh0aGlzKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJlZm9yZSB0aGlzIG9iamVjdCB3aWxsIGJlIGRpc2NhcmRlZC4gRGlzcG9zZXMgdGhlIHVuZGVybHlpbmcKKyAgICAgKiBNZXNzYWdlQnVuZGxlcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJZm9yIChJTWVzc2FnZXNCdW5kbGUgbWIgOiBnZXRNZXNzYWdlc0J1bmRsZXMoKSkgeworCSAgICB0cnkgeworCQltYi5kaXNwb3NlKCk7CisJICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCS8vIEZJWE1FOiByZW1vdmUgZGVidWc6CisJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgZGlzcG9zaW5nIG1lc3NhZ2UtYnVuZGxlICIKKwkJCSsgKChNZXNzYWdlc0J1bmRsZSkgbWIpLmdldFJlc291cmNlKCkKKwkJCQkuZ2V0UmVzb3VyY2VMb2NhdGlvbkxhYmVsKCkpOworCQkvLyBkaXNyZWdhcmQgY3Jhc2hlczogdGhpcyBpcyBhIGJlc3QgZWZmb3J0IHRvIGRpc3Bvc2UgdGhpbmdzLgorCSAgICB9CisJfQorCisJUkJNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMucHJvamVjdE5hbWUpCisJCS5ub3RpZnlNZXNzYWdlc0J1bmRsZUdyb3VwRGVsZXRlZCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZXNzYWdlcyBidW5kbGUgbWF0Y2hpbmcgZ2l2ZW4gbG9jYWxlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgIGxvY2FsZSBvZiBidW5kbGUgdG8gcmV0cmVpdmUKKyAgICAgKiBAcmV0dXJuIGEgYnVuZGxlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElNZXNzYWdlc0J1bmRsZSBnZXRNZXNzYWdlc0J1bmRsZShMb2NhbGUgbG9jYWxlKSB7CisJcmV0dXJuIGxvY2FsZUJ1bmRsZXMuZ2V0KGxvY2FsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVzc2FnZXMgYnVuZGxlIG1hdGNoaW5nIGdpdmVuIHNvdXJjZSBvYmplY3QuIEEgc291cmNlIG9iamVjdAorICAgICAqIGJlaW5nIGEgY29udGV4dC1zcGVjaWZpYyBjb25jcmV0ZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIGEKKyAgICAgKiA8Y29kZT5NZXNzYWdlc0J1bmRsZTwvY29kZT4gYXMgcGVyIGRlZmluZWQgaW4KKyAgICAgKiA8Y29kZT5JTWVzc2FnZVJlc291cmNlPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG9iamVjdCB0byBtYXRjaAorICAgICAqIEByZXR1cm4gYSBtZXNzYWdlcyBidW5kbGUKKyAgICAgKiBAc2VlIElNZXNzYWdlc1Jlc291cmNlCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VzQnVuZGxlIGdldE1lc3NhZ2VzQnVuZGxlKE9iamVjdCBzb3VyY2UpIHsKKwlmb3IgKElNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSA6IGdldE1lc3NhZ2VzQnVuZGxlcygpKSB7CisJICAgIGlmIChlcXVhbHMoc291cmNlLCAoKE1lc3NhZ2VzQnVuZGxlKSBtZXNzYWdlc0J1bmRsZSkuZ2V0UmVzb3VyY2UoKQorCQkgICAgLmdldFNvdXJjZSgpKSkgeworCQlyZXR1cm4gKE1lc3NhZ2VzQnVuZGxlKSBtZXNzYWdlc0J1bmRsZTsKKwkgICAgfQorCX0KKwlyZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGVtcHR5IDxjb2RlPk1lc3NhZ2VzQnVuZGxlPC9jb2RlPiB0byB0aGlzIGdyb3VwIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiBsb2NhbGUuCisgICAgICogCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgbG9jYWxlIGZvciB0aGUgbmV3IGJ1bmRsZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VzQnVuZGxlKExvY2FsZSBsb2NhbGUpIHsKKwlhZGRNZXNzYWdlc0J1bmRsZShncm91cFN0cmF0ZWd5LmNyZWF0ZU1lc3NhZ2VzQnVuZGxlKGxvY2FsZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYWxsIGxvY2FsZXMgbWFraW5nIHVwIHRoaXMgbWVzc2FnZXMgYnVuZGxlIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBMb2NhbGVbXSBnZXRMb2NhbGVzKCkgeworCXJldHVybiBsb2NhbGVCdW5kbGVzLmtleVNldCgpLnRvQXJyYXkoRU1QVFlfTE9DQUxFUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGtleS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICBhIG1lc3NhZ2Uga2V5CisgICAgICogQHJldHVybiBtZXNzYWdlcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJTWVzc2FnZVtdIGdldE1lc3NhZ2VzKFN0cmluZyBrZXkpIHsKKwlMaXN0PElNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8SU1lc3NhZ2U+KCk7CisJZm9yIChJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUgOiBnZXRNZXNzYWdlc0J1bmRsZXMoKSkgeworCSAgICBJTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZXNCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOworCSAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7CisJCW1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKKwkgICAgfQorCX0KKwlyZXR1cm4gbWVzc2FnZXMudG9BcnJheShFTVBUWV9NRVNTQUdFUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVzc2FnZSBtYXRjaGluZyBnaXZlbiBrZXkgYW5kIGxvY2FsZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICBsb2NhbGUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBtZXNzYWdlCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAga2V5IG1hdGNoaW5nIGVudHJ5IHRvIHJldHJpZXZlIHRoZSBtZXNzYWdlCisgICAgICogQHJldHVybiBhIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKSB7CisJSU1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlID0gZ2V0TWVzc2FnZXNCdW5kbGUobG9jYWxlKTsKKwlpZiAobWVzc2FnZXNCdW5kbGUgIT0gbnVsbCkgeworCSAgICByZXR1cm4gbWVzc2FnZXNCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOworCX0KKwlyZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbWVzc2FnZXMgYnVuZGxlIHRvIHRoaXMgZ3JvdXAuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2VzQnVuZGxlCisgICAgICogICAgICAgICAgICBidW5kbGUgdG8gYWRkCisgICAgICogQHRocm93cyBNZXNzYWdlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBtZXNzYWdlcyBidW5kbGUgZm9yIHRoZSBzYW1lIGxvY2FsZSBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlc0J1bmRsZShJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpIHsKKwlhZGRNZXNzYWdlc0J1bmRsZShtZXNzYWdlc0J1bmRsZS5nZXRMb2NhbGUoKSwgbWVzc2FnZXNCdW5kbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBtZXNzYWdlcyBidW5kbGUgdG8gdGhpcyBncm91cC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICBUaGUgbG9jYWxlIG9mIHRoZSBidW5kbGUKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXNCdW5kbGUKKyAgICAgKiAgICAgICAgICAgIGJ1bmRsZSB0byBhZGQKKyAgICAgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIG1lc3NhZ2VzIGJ1bmRsZSBmb3IgdGhlIHNhbWUgbG9jYWxlIGFscmVhZHkgZXhpc3RzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VzQnVuZGxlKExvY2FsZSBsb2NhbGUsIElNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgeworCU1lc3NhZ2VzQnVuZGxlIG1iID0gKE1lc3NhZ2VzQnVuZGxlKSBtZXNzYWdlc0J1bmRsZTsKKwlpZiAobG9jYWxlQnVuZGxlcy5nZXQobWIuZ2V0TG9jYWxlKCkpICE9IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24oCisJCSAgICAiQSBidW5kbGUgd2l0aCB0aGUgc2FtZSBsb2NhbGUgYWxyZWFkeSBleGlzdHMuIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlpbnQgb2xkQnVuZGxlQ291bnQgPSBsb2NhbGVCdW5kbGVzLnNpemUoKTsKKwlsb2NhbGVCdW5kbGVzLnB1dChtYi5nZXRMb2NhbGUoKSwgbWIpOworCisJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BFUlRZX01FU1NBR0VTX0JVTkRMRV9DT1VOVCwgb2xkQnVuZGxlQ291bnQsCisJCWxvY2FsZUJ1bmRsZXMuc2l6ZSgpKTsKKwlmaXJlTWVzc2FnZXNCdW5kbGVBZGRlZChtYik7CisKKwlTdHJpbmdbXSBidW5kbGVLZXlzID0gbWIuZ2V0S2V5cygpOworCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlS2V5cy5sZW5ndGg7IGkrKykgeworCSAgICBTdHJpbmcga2V5ID0gYnVuZGxlS2V5c1tpXTsKKwkgICAgaWYgKCFrZXlzLmNvbnRhaW5zKGtleSkpIHsKKwkJaW50IG9sZEtleUNvdW50ID0ga2V5cy5zaXplKCk7CisJCWtleXMuYWRkKGtleSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QRVJUWV9LRVlfQ09VTlQsIG9sZEtleUNvdW50LCBrZXlzLnNpemUoKSk7CisJCWZpcmVLZXlBZGRlZChrZXkpOworCSAgICB9CisJfQorCW1iLmFkZE1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIobWVzc2FnZXNCdW5kbGVMaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSB7QGxpbmsgSU1lc3NhZ2VzQnVuZGxlfSBmcm9tIHRoZSBncm91cC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXNCdW5kbGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBidW5kbGUgdG8gcmVtb3ZlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VzQnVuZGxlKElNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgeworCUxvY2FsZSBsb2NhbGUgPSBtZXNzYWdlc0J1bmRsZS5nZXRMb2NhbGUoKTsKKworCWlmIChsb2NhbGVCdW5kbGVzLmNvbnRhaW5zS2V5KGxvY2FsZSkpIHsKKwkgICAgbG9jYWxlQnVuZGxlcy5yZW1vdmUobG9jYWxlKTsKKwl9CisKKwkvLyB3aGljaCBrZXlzIHNob3VsZCBJIG5vdCByZW1vdmU/CisJU2V0PFN0cmluZz4ga2V5c05vdFRvUmVtb3ZlID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworCisJZm9yIChTdHJpbmcga2V5IDogbWVzc2FnZXNCdW5kbGUuZ2V0S2V5cygpKSB7CisJICAgIGZvciAoSU1lc3NhZ2VzQnVuZGxlIGJ1bmRsZSA6IGxvY2FsZUJ1bmRsZXMudmFsdWVzKCkpIHsKKwkJaWYgKGJ1bmRsZS5nZXRNZXNzYWdlKGtleSkgIT0gbnVsbCkgeworCQkgICAga2V5c05vdFRvUmVtb3ZlLmFkZChrZXkpOworCQl9CisJICAgIH0KKwl9CisKKwkvLyByZW1vdmUga2V5cworCWZvciAoU3RyaW5nIGtleVRvUmVtb3ZlIDogbWVzc2FnZXNCdW5kbGUuZ2V0S2V5cygpKSB7CisJICAgIGlmICgha2V5c05vdFRvUmVtb3ZlLmNvbnRhaW5zKGtleVRvUmVtb3ZlKSkgeyAvLyB3ZSBjYW4gcmVtb3ZlCisJCWtleXMucmVtb3ZlKGtleVRvUmVtb3ZlKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoaXMgbWVzc2FnZXMgYnVuZGxlIGdyb3VwIG5hbWUuIFRoYXQgaXMgdGhlIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yCisgICAgICogdGhlIHRhYiBvZiB0aGUgTXVsdGlQYWdlRWRpdG9yUGFydAorICAgICAqIAorICAgICAqIEByZXR1cm4gYnVuZGxlIGdyb3VwIG5hbWUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBlbXB0eSBtZXNzYWdlIHRvIGV2ZXJ5IG1lc3NhZ2VzIGJ1bmRsZSBvZiB0aGlzIGdyb3VwIHdpdGggdGhlCisgICAgICogZ2l2ZW4uCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgbWVzc2FnZSBrZXkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlcyhTdHJpbmcga2V5KSB7CisJZm9yIChJTWVzc2FnZXNCdW5kbGUgbXNnQnVuZGxlIDogbG9jYWxlQnVuZGxlcy52YWx1ZXMoKSkgeworCSAgICAoKE1lc3NhZ2VzQnVuZGxlKSBtc2dCdW5kbGUpLmFkZE1lc3NhZ2Uoa2V5KTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuYW1lcyBhIGtleSBpbiBhbGwgbWVzc2FnZXMgYnVuZGxlcyBmb3JtaW5nIHRoaXMgZ3JvdXAuCisgICAgICogCisgICAgICogQHBhcmFtIHNvdXJjZUtleQorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2Uga2V5IHRvIHJlbmFtZQorICAgICAqIEBwYXJhbSB0YXJnZXRLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbWVzc2FnZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lTWVzc2FnZUtleXMoU3RyaW5nIHNvdXJjZUtleSwgU3RyaW5nIHRhcmdldEtleSkgeworCWZvciAoSU1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IGxvY2FsZUJ1bmRsZXMudmFsdWVzKCkpIHsKKwkgICAgbXNnQnVuZGxlLnJlbmFtZU1lc3NhZ2VLZXkoc291cmNlS2V5LCB0YXJnZXRLZXkpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIG1lc3NhZ2VzIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkgZnJvbSBhbGwgbWVzc2FnZXMgYnVuZGxlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIGtleSBvZiBtZXNzYWdlcyB0byByZW1vdmUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlcyhTdHJpbmcga2V5KSB7CisJZm9yIChJTWVzc2FnZXNCdW5kbGUgbXNnQnVuZGxlIDogbG9jYWxlQnVuZGxlcy52YWx1ZXMoKSkgeworCSAgICBtc2dCdW5kbGUucmVtb3ZlTWVzc2FnZShrZXkpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIG1lc3NhZ2VzIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkgZnJvbSBhbGwgbWVzc2FnZXMgYnVuZGxlIGFuZCBhZGQKKyAgICAgKiBpdCdzIHBhcmVudCBrZXkgdG8gYnVuZGxlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICBrZXkgb2YgbWVzc2FnZXMgdG8gcmVtb3ZlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZXNBZGRQYXJlbnRLZXkoU3RyaW5nIGtleSkgeworCWZvciAoSU1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IGxvY2FsZUJ1bmRsZXMudmFsdWVzKCkpIHsKKwkgICAgbXNnQnVuZGxlLnJlbW92ZU1lc3NhZ2VBZGRQYXJlbnRLZXkoa2V5KTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIG1lc3NhZ2VzIG1hdGNoaW5nIHRoZSA8Y29kZT5rZXk8L2NvZGU+IGFyZSBhY3RpdmUgb3Igbm90LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIGtleSBvZiBtZXNzYWdlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VzQWN0aXZlKFN0cmluZyBrZXksIGJvb2xlYW4gYWN0aXZlKSB7CisJZm9yIChJTWVzc2FnZXNCdW5kbGUgbXNnQnVuZGxlIDogbG9jYWxlQnVuZGxlcy52YWx1ZXMoKSkgeworCSAgICBJTWVzc2FnZSBlbnRyeSA9IG1zZ0J1bmRsZS5nZXRNZXNzYWdlKGtleSk7CisJICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisJCWVudHJ5LnNldEFjdGl2ZShhY3RpdmUpOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIER1cGxpY2F0ZXMgZWFjaCBtZXNzYWdlcyBtYXRjaGluZyB0aGUgPGNvZGU+c291cmNlS2V5PC9jb2RlPiB0byB0aGUKKyAgICAgKiA8Y29kZT5uZXdLZXk8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzb3VyY2VLZXkKKyAgICAgKiAgICAgICAgICAgIG9yaWdpbmFsIGtleQorICAgICAqIEBwYXJhbSB0YXJnZXRLZXkKKyAgICAgKiAgICAgICAgICAgIG5ldyBrZXkKKyAgICAgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIHRhcmdldCBrZXkgYWxyZWFkeSBleGlzdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdXBsaWNhdGVNZXNzYWdlcyhTdHJpbmcgc291cmNlS2V5LCBTdHJpbmcgdGFyZ2V0S2V5KSB7CisJaWYgKHNvdXJjZUtleS5lcXVhbHModGFyZ2V0S2V5KSkgeworCSAgICByZXR1cm47CisJfQorCWZvciAoSU1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IGxvY2FsZUJ1bmRsZXMudmFsdWVzKCkpIHsKKwkgICAgbXNnQnVuZGxlLmR1cGxpY2F0ZU1lc3NhZ2Uoc291cmNlS2V5LCB0YXJnZXRLZXkpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBhbGwgYnVuZGxlcyBpbiB0aGlzIGdyb3VwLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJ1bmRsZXMgaW4gdGhpcyBncm91cAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPElNZXNzYWdlc0J1bmRsZT4gZ2V0TWVzc2FnZXNCdW5kbGVzKCkgeworCXJldHVybiBsb2NhbGVCdW5kbGVzLnZhbHVlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYWxsIGtleXMgZnJvbSBhbGwgbWVzc2FnZXMgYnVuZGxlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFsbCBrZXlzIGZyb20gYWxsIG1lc3NhZ2VzIGJ1bmRsZXMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWVzc2FnZUtleXMoKSB7CisJcmV0dXJuIGtleXMudG9BcnJheShCYWJlbFV0aWxzLkVNUFRZX1NUUklOR1MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGdpdmVuIGtleSBpcyBmb3VuZCBpbiB0aGlzIG1lc3NhZ2VzIGJ1bmRsZSBncm91cC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGZpbmQKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBrZXkgZXhpc3RzIGluIHRoaXMgYnVuZGxlIGdyb3VwLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTWVzc2FnZUtleShTdHJpbmcga2V5KSB7CisJcmV0dXJuIGtleXMuY29udGFpbnMoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgYnVuZGxlcyBpbiB0aGlzIGdyb3VwLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBidW5kbGVzIGluIHRoaXMgZ3JvdXAKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE1lc3NhZ2VzQnVuZGxlQ291bnQoKSB7CisJcmV0dXJuIGxvY2FsZUJ1bmRsZXMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCWlmICghKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VzQnVuZGxlR3JvdXApKSB7CisJICAgIHJldHVybiBmYWxzZTsKKwl9CisJTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwID0gKE1lc3NhZ2VzQnVuZGxlR3JvdXApIG9iajsKKwlyZXR1cm4gZXF1YWxzKGxvY2FsZUJ1bmRsZXMsIG1lc3NhZ2VzQnVuZGxlR3JvdXAubG9jYWxlQnVuZGxlcyk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIGFkZE1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcigKKwkgICAgZmluYWwgSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lciBsaXN0ZW5lcikgeworCWFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIoCisJICAgIGZpbmFsIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwlyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBnZXRNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJzKCkgeworCS8vIFRPRE8gZmluZCBtb3JlIGVmZmljaWVudCB3YXkgdG8gYXZvaWQgY2xhc3MgY2FzdC4KKwlyZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpKS50b0FycmF5KAorCQlFTVBUWV9HUk9VUF9MSVNURU5FUlMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaXJlS2V5QWRkZWQoU3RyaW5nIGtleSkgeworCUlNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBnZXRNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJzKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKwkgICAgSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKKwkgICAgbGlzdGVuZXIua2V5QWRkZWQoa2V5KTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpcmVLZXlSZW1vdmVkKFN0cmluZyBrZXkpIHsKKwlJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyW10gbGlzdGVuZXJzID0gZ2V0TWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVycygpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisJICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07CisJICAgIGxpc3RlbmVyLmtleVJlbW92ZWQoa2V5KTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpcmVNZXNzYWdlc0J1bmRsZUFkZGVkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlKSB7CisJSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcltdIGxpc3RlbmVycyA9IGdldE1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lcnMoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCSAgICBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOworCSAgICBsaXN0ZW5lci5tZXNzYWdlc0J1bmRsZUFkZGVkKG1lc3NhZ2VzQnVuZGxlKTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpcmVNZXNzYWdlc0J1bmRsZVJlbW92ZWQoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpIHsKKwlJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyW10gbGlzdGVuZXJzID0gZ2V0TWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVycygpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisJICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07CisJICAgIGxpc3RlbmVyLm1lc3NhZ2VzQnVuZGxlUmVtb3ZlZChtZXNzYWdlc0J1bmRsZSk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3VwcGxpZWQga2V5IGlzIGFscmVhZHkgZXhpc3RpbmcgaW4gdGhpcyBncm91cC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICBUaGUga2V5IHRoYXQgc2hhbGwgYmUgdGVzdGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSA8PT4gVGhlIGtleSBpcyBhbHJlYWR5IGV4aXN0aW5nLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KFN0cmluZyBrZXkpIHsKKwlmb3IgKExvY2FsZSBsb2NhbGUgOiBsb2NhbGVCdW5kbGVzLmtleVNldCgpKSB7CisJICAgIElNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSA9IGxvY2FsZUJ1bmRsZXMuZ2V0KGxvY2FsZSk7CisJICAgIGZvciAoU3RyaW5nIGsgOiBtZXNzYWdlc0J1bmRsZS5nZXRLZXlzKCkpIHsKKwkJaWYgKGsuZXF1YWxzKGtleSkpIHsKKwkJICAgIHJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorCX0KKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGdpdmVuIGtleSBmb3VuZCBpbiB0aGlzIGJ1bmRsZSBncm91cC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGZpbmQKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBrZXkgZXhpc3RzIGluIHRoaXMgYnVuZGxlIGdyb3VwLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzS2V5KFN0cmluZyBrZXkpIHsKKwlyZXR1cm4ga2V5cy5jb250YWlucyhrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgYnVuZGxlIGdyb3VwLiBUaGF0IGlzIHVzdWFsbHk6CisgICAgICogPGRpcmVjdG9yeT4iLiI8ZGVmYXVsdC1maWxlbmFtZT4uIFRoZSBkZWZhdWx0IGZpbGVuYW1lIGlzIHdpdGhvdXQgdGhlCisgICAgICogc3VmZml4IChlLmcuIF9lbiwgb3IgX2VuX0dCKS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZSBncm91cAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVJZCgpIHsKKwlyZXR1cm4gcmVzb3VyY2VCdW5kbGVJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LCB0aGUgcmVzb3VyY2UgYnVuZGxlIGdyb3VwIGlzIGluLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHByb2plY3QgbmFtZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7CisJcmV0dXJuIHRoaXMucHJvamVjdE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIGluIHVuZGVybHlpbmcgbWVzc2FnZXMgYnVuZGxlIGFuZCByZWxheXMgdGhlbQorICAgICAqIHRvIHRoZSBsaXN0ZW5lcnMgZm9yIE1lc3NhZ2VzQnVuZGxlR3JvdXAuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBNZXNzYWdlc0J1bmRsZUxpc3RlbmVyIGltcGxlbWVudHMgSU1lc3NhZ2VzQnVuZGxlTGlzdGVuZXIgeworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lc3NhZ2VBZGRlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSwgTWVzc2FnZSBtZXNzYWdlKSB7CisJICAgIGludCBvbGRDb3VudCA9IGtleXMuc2l6ZSgpOworCSAgICBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyW10gbGlzdGVuZXJzID0gZ2V0TWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVycygpOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCQlJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOworCQlsaXN0ZW5lci5tZXNzYWdlQWRkZWQobWVzc2FnZXNCdW5kbGUsIG1lc3NhZ2UpOworCQlpZiAoZ2V0TWVzc2FnZXMobWVzc2FnZS5nZXRLZXkoKSkubGVuZ3RoID09IDEpIHsKKwkJICAgIGtleXMuYWRkKG1lc3NhZ2UuZ2V0S2V5KCkpOworCQkgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BFUlRZX0tFWV9DT1VOVCwgb2xkQ291bnQsCisJCQkgICAga2V5cy5zaXplKCkpOworCQkgICAgZmlyZUtleUFkZGVkKG1lc3NhZ2UuZ2V0S2V5KCkpOworCQl9CisJICAgIH0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtZXNzYWdlUmVtb3ZlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSwKKwkJTWVzc2FnZSBtZXNzYWdlKSB7CisJICAgIGludCBvbGRDb3VudCA9IGtleXMuc2l6ZSgpOworCSAgICBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyW10gbGlzdGVuZXJzID0gZ2V0TWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVycygpOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCQlJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOworCQlsaXN0ZW5lci5tZXNzYWdlUmVtb3ZlZChtZXNzYWdlc0J1bmRsZSwgbWVzc2FnZSk7CisJCWludCBrZXlNZXNzYWdlc0NvdW50ID0gZ2V0TWVzc2FnZXMobWVzc2FnZS5nZXRLZXkoKSkubGVuZ3RoOworCQlpZiAoa2V5TWVzc2FnZXNDb3VudCA9PSAwICYmIGtleXMuY29udGFpbnMobWVzc2FnZS5nZXRLZXkoKSkpIHsKKwkJICAgIGtleXMucmVtb3ZlKG1lc3NhZ2UuZ2V0S2V5KCkpOworCQkgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BFUlRZX0tFWV9DT1VOVCwgb2xkQ291bnQsCisJCQkgICAga2V5cy5zaXplKCkpOworCQkgICAgZmlyZUtleVJlbW92ZWQobWVzc2FnZS5nZXRLZXkoKSk7CisJCX0KKwkgICAgfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lc3NhZ2VDaGFuZ2VkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlLAorCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KSB7CisJICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBnZXRNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXJzKCk7CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisJCUlNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07CisJCWxpc3RlbmVyLm1lc3NhZ2VDaGFuZ2VkKG1lc3NhZ2VzQnVuZGxlLCBjaGFuZ2VFdmVudCk7CisJICAgIH0KKwl9CisKKwkvLyBNZXNzYWdlc0J1bmRsZSBwcm9wZXJ0eSBjaGFuZ2VzOgorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisJICAgIE1lc3NhZ2VzQnVuZGxlIGJ1bmRsZSA9IChNZXNzYWdlc0J1bmRsZSkgZXZ0LmdldFNvdXJjZSgpOworCSAgICBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyW10gbGlzdGVuZXJzID0gZ2V0TWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVycygpOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCQlJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOworCQlsaXN0ZW5lci5tZXNzYWdlc0J1bmRsZUNoYW5nZWQoYnVuZGxlLCBldnQpOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJ1bmRsZSBncm91cCBoYXMKKyAgICAgKiAgICAgICAgIHtAbGluayBQcm9wZXJ0aWVzRmlsZUdyb3VwU3RyYXRlZ3l9IGFzIHN0cmF0ZWd5LCBlbHNlCisgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgaXMgdGhlIGNhc2UsIHdoZW4gb25seSBUYXBpSkkgZWRpdHMgdGhlCisgICAgICogICAgICAgICByZXNvdXJjZSBidW5kbGVzIGFuZCBubyBoYXZlIGJlZW4gb3BlbmVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXNGaWxlR3JvdXBTdHJhdGVneSgpIHsKKwlyZXR1cm4gZ3JvdXBTdHJhdGVneSBpbnN0YW5jZW9mIFByb3BlcnRpZXNGaWxlR3JvdXBTdHJhdGVneTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZXNCdW5kbGVHcm91cEFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlc0J1bmRsZUdyb3VwQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMWE2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZXNCdW5kbGVHcm91cEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDgxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKKworLyoqCisgKiBBbiBhZGFwdGVyIGNsYXNzIGZvciBhIHtAbGluayBJTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyfS4gIE1ldGhvZHMgCisgKiBpbXBsZW1lbnRhdGlvbiBkbyBub3RoaW5nLgorICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlIChwYXNjYWxAZXNzaWVtYnJlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzQnVuZGxlR3JvdXBBZGFwdGVyCisgICAgICAgIGltcGxlbWVudHMgSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lciMKKyAgICAgKiAgICAgICAgICAgICAga2V5QWRkZWQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBrZXlBZGRlZChTdHJpbmcga2V5KSB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICB9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lciMKKyAgICAgKiAgICAgICAgICAgICAga2V5UmVtb3ZlZChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGtleVJlbW92ZWQoU3RyaW5nIGtleSkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLklNZXNzYWdlc0J1bmRsZUdyb3VwTGlzdGVuZXIjCisgICAgICogICAgICBtZXNzYWdlc0J1bmRsZUFkZGVkKG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlc0J1bmRsZUFkZGVkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlKSB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICB9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuSU1lc3NhZ2VzQnVuZGxlR3JvdXBMaXN0ZW5lciMKKyAgICAgKiAgICAgIG1lc3NhZ2VzQnVuZGxlQ2hhbmdlZChvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VzQnVuZGxlQ2hhbmdlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSwKKyAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2hhbmdlRXZlbnQpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5JTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyCisgICAgICogICAgICNtZXNzYWdlc0J1bmRsZVJlbW92ZWQob3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VzQnVuZGxlUmVtb3ZlZChNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLklNZXNzYWdlc0J1bmRsZUxpc3RlbmVyI21lc3NhZ2VBZGRlZCgKKyAgICAgKiAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlLAorICAgICAqICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlQWRkZWQoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUsIE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLklNZXNzYWdlc0J1bmRsZUxpc3RlbmVyIworICAgICAqICAgICAgbWVzc2FnZUNoYW5nZWQob3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VDaGFuZ2VkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlLAorICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VFdmVudCBjaGFuZ2VFdmVudCkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLklNZXNzYWdlc0J1bmRsZUxpc3RlbmVyIworICAgICAqICAgICAgbWVzc2FnZVJlbW92ZWQob3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2UpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlbW92ZWQoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUsIE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKAorICAgICAqICAgICAgICAgICBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9tYW5hZ2VyL0lNZXNzYWdlc0VkaXRvckxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvbWFuYWdlci9JTWVzc2FnZXNFZGl0b3JMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDA0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvbWFuYWdlci9JTWVzc2FnZXNFZGl0b3JMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQWxleGVqIFN0cmVsem93LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEFsZXhlaiBTdHJlbHpvdyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLm1hbmFnZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlOworCisvKioKKyAqIFVzZWQgdG8gc3luYyBUYXBpSkkgd2l0aCBCYWJlbCBhbmQgdmljZSB2ZXJzYS4KKyAqIDxicj48YnI+CisgKiAKKyAqIEBhdXRob3IgQWxleGVqIFN0cmVsem93CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VzRWRpdG9yTGlzdGVuZXIgeworCisJLyoqCisJICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBwZXJmb3JtcyBzYXZlIQorCSAqLworCXZvaWQgb25TYXZlKCk7CisJCisJLyoqCisJICogQ2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBFZGl0b3IgY2hhbmdlcy4KKwkgKi8KKwl2b2lkIG9uTW9kaWZ5KCk7CisJCisJLyoqCisJICogQ2FsbGVkIHdoZW4gYSB7QGxpbmsgSU1lc3NhZ2VzQnVuZGxlfSBjaGFuZ2VkLgorCSAqIEBwYXJhbSBidW5kbGUKKwkgKi8KKwl2b2lkIG9uUmVzb3VyY2VDaGFuZ2VkKElNZXNzYWdlc0J1bmRsZSBidW5kbGUpOworCS8vIFRPRE86IEdldCByaWQgb2YgdGhpcyBtZXRob2QsIG1heWJlIG1lcmdlIHdpdGggb25Nb2RpZnkoKQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL21hbmFnZXIvSVJlc291cmNlRGVsdGFMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL21hbmFnZXIvSVJlc291cmNlRGVsdGFMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTJkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvbWFuYWdlci9JUmVzb3VyY2VEZWx0YUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbGV4ZWogU3RyZWx6b3cuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgQWxleGVqIFN0cmVsem93IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UubWFuYWdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CisKKworLyoqCisgKiBVc2VkIHRvIHVwZGF0ZSBUYXBpSkkgKFJlc291cmNlQnVuZGxlTWFuYWdlcikgd2hlbiBidW5kbGVzIGhhdmUgYmVlbiByZW1vdmVkLgorICogPGJyPjxicj4KKyAqIAorICogQGF1dGhvciBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VEZWx0YUxpc3RlbmVyIHsKKworCS8qKgorCSAqIENhbGxlZCB3aGVuIGEgcmVzb3VyY2UgKD0gYnVuZGxlKSBoYXMgYmVlbiByZW1vdmVkCisJICogQHBhcmFtIHJlc291cmNlQnVuZGxlSWQgVGhlIHtAbGluayBJTWVzc2FnZXNCdW5kbGVHcm91cH0gd2hpY2ggY29udGFpbnMgdGhlIGJ1bmRsZQorCSAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgaXRzZWxmCisJICovCisJcHVibGljIHZvaWQgb25EZWxldGUoU3RyaW5nIHJlc291cmNlQnVuZGxlSWQsIElSZXNvdXJjZSByZXNvdXJjZSk7CisJCisJLyoqCisJICogQ2FsbGVkIHdoZW4gYSB7QGxpbmsgSU1lc3NhZ2VzQnVuZGxlR3JvdXB9IGhhcyBiZWVuIHJlbW92ZWQKKwkgKiBAcGFyYW0gYnVuZGxlR3JvdXAgVGhlIHJlbW92ZWQgYnVuZGxlIGdyb3VwCisJICovCisJcHVibGljIHZvaWQgb25EZWxldGUoSU1lc3NhZ2VzQnVuZGxlR3JvdXAgYnVuZGxlR3JvdXApOworCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL21hbmFnZXIvUkJNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvbWFuYWdlci9SQk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2I1Mzc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL21hbmFnZXIvUkJNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw1NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQWxleGVqIFN0cmVsem93LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEFsZXhlaiBTdHJlbHpvdyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLm1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuY29uZmlndXJhdGlvbi5EaXJ0eUhhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5mYWN0b3J5Lk1lc3NhZ2VzQnVuZGxlR3JvdXBGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWwuTmFtZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbC5QREVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworCisvKioKKyAqIE1hbmFnZXMgYWxsIHtAbGluayBNZXNzYWdlc0J1bmRsZUdyb3VwfXMuIFRoYXQgaXM6IDxsaT5Ib2xkIG1hcCB3aXRoIHByb2plY3RzCisgKiBhbmQgdGhlaXIgUkJNYW5hZ2VyICgxIFJCTWFuYWdlciBwZXIgcHJvamVjdCk8L2xpPiA8bGk+SG9sZCB1cC10by1kYXRlIG1hcAorICogd2l0aCByZXNvdXJjZSBidW5kbGVzICg9IHtAbGluayBNZXNzYWdlc0J1bmRsZUdyb3VwfSk8L2xpPiA8bGk+SG9sZAorICoge0BsaW5rIElNZXNzYWdlc0VkaXRvckxpc3RlbmVyfSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8ga2VlcCBzeXN0ZW1zIGluIHN5bmM8L2xpPgorICogPGJyPgorICogPGJyPgorICogCisgKiBAYXV0aG9yIEFsZXhlaiBTdHJlbHpvdworICovCitwdWJsaWMgY2xhc3MgUkJNYW5hZ2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxJUHJvamVjdCwgUkJNYW5hZ2VyPiBtYW5hZ2VyTWFwID0gbmV3IEhhc2hNYXA8SVByb2plY3QsIFJCTWFuYWdlcj4oKTsKKworICAgIC8qKiA8cGFja2FnZT4uPHJlc291cmNlQnVuZGxlTmFtZT4gLCBJTWVzc2FnZXNCdW5kbGVHcm91cCAqLworICAgIHByaXZhdGUgTWFwPFN0cmluZywgSU1lc3NhZ2VzQnVuZGxlR3JvdXA+IHJlc291cmNlQnVuZGxlczsKKworICAgIHByaXZhdGUgc3RhdGljIFJCTWFuYWdlciBJTlNUQU5DRTsKKworICAgIHByaXZhdGUgTGlzdDxJTWVzc2FnZXNFZGl0b3JMaXN0ZW5lcj4gZWRpdG9yTGlzdGVuZXJzOworCisgICAgcHJpdmF0ZSBMaXN0PElSZXNvdXJjZURlbHRhTGlzdGVuZXI+IHJlc291cmNlTGlzdGVuZXJzOworCisgICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUElKSV9OQVRVUkUgPSAib3JnLmVjbGlwc2UuYmFiZWwudGFwaWppLnRvb2xzLmNvcmUudWkubmF0dXJlIjsKKworICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJCTWFuYWdlci5jbGFzcworCSAgICAuZ2V0U2ltcGxlTmFtZSgpKTsKKworICAgIHByaXZhdGUgUkJNYW5hZ2VyKCkgeworCXJlc291cmNlQnVuZGxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSU1lc3NhZ2VzQnVuZGxlR3JvdXA+KCk7CisJZWRpdG9yTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTWVzc2FnZXNFZGl0b3JMaXN0ZW5lcj4oMyk7CisJcmVzb3VyY2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZURlbHRhTGlzdGVuZXI+KDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZUlkCisgICAgICogICAgICAgICAgICA8cGFja2FnZT4uPHJlc291cmNlQnVuZGxlTmFtZT4KKyAgICAgKiBAcmV0dXJuIHtAbGluayBJTWVzc2FnZXNCdW5kbGVHcm91cH0gaWYgZm91bmQsIGVsc2UgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgSU1lc3NhZ2VzQnVuZGxlR3JvdXAgZ2V0TWVzc2FnZXNCdW5kbGVHcm91cChTdHJpbmcgcmVzb3VyY2VCdW5kbGVJZCkgeworCWlmICghcmVzb3VyY2VCdW5kbGVzLmNvbnRhaW5zS2V5KHJlc291cmNlQnVuZGxlSWQpKSB7CisJICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLAorCQkgICAgImdldE1lc3NhZ2VzQnVuZGxlR3JvdXAgd2l0aCBub24tZXhpc3RpbmcgSWQ6ICIKKwkJCSAgICArIHJlc291cmNlQnVuZGxlSWQpOworCSAgICByZXR1cm4gbnVsbDsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gcmVzb3VyY2VCdW5kbGVzLmdldChyZXNvdXJjZUJ1bmRsZUlkKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBBbGwgdGhlIG5hbWVzIG9mIHRoZSA8Y29kZT5yZXNvdXJjZUJ1bmRsZXM8L2NvZGU+IGluIHRoZSBmb3JtYXQ6CisgICAgICogICAgICAgICA8cHJvamVjdE5hbWU+LzxyZXNvdXJjZUJ1bmRsZUlkPgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWVzc2FnZXNCdW5kbGVHcm91cE5hbWVzKCkgeworCUxpc3Q8U3RyaW5nPiBidW5kbGVHcm91cE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwlmb3IgKFN0cmluZyBrZXkgOiByZXNvdXJjZUJ1bmRsZXMua2V5U2V0KCkpIHsKKwkgICAgYnVuZGxlR3JvdXBOYW1lcy5hZGQocHJvamVjdC5nZXROYW1lKCkgKyAiLyIgKyBrZXkpOworCX0KKwlyZXR1cm4gYnVuZGxlR3JvdXBOYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEFsbCB0aGUge0BsaW5rICNnZXRNZXNzYWdlc0J1bmRsZUdyb3VwTmFtZXMoKX0gb2YgYWxsIHRoZQorICAgICAqICAgICAgICAgcHJvamVjdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0QWxsTWVzc2FnZXNCdW5kbGVHcm91cE5hbWVzKCkgeworCUxpc3Q8U3RyaW5nPiBidW5kbGVHcm91cE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBnZXRBbGxTdXBwb3J0ZWRQcm9qZWN0cygpKSB7CisJICAgIFJCTWFuYWdlciBtYW5hZ2VyID0gZ2V0SW5zdGFuY2UocHJvamVjdCk7CisJICAgIGZvciAoU3RyaW5nIG5hbWUgOiBtYW5hZ2VyLmdldE1lc3NhZ2VzQnVuZGxlR3JvdXBOYW1lcygpKSB7CisJCWlmICghYnVuZGxlR3JvdXBOYW1lcy5jb250YWlucyhuYW1lKSkgeworCQkgICAgYnVuZGxlR3JvdXBOYW1lcy5hZGQobmFtZSk7CisJCX0KKwkgICAgfQorCX0KKwlyZXR1cm4gYnVuZGxlR3JvdXBOYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24sIHRoYXQgYSB7QGxpbmsgSU1lc3NhZ2VzQnVuZGxlR3JvdXB9IGhhcyBiZWVuIGNyZWF0ZWQgYW5kCisgICAgICogbmVlZHMgdG8gYmUgbWFuYWdlZCBieSB0aGUge0BsaW5rIFJCTWFuYWdlcn0uCisgICAgICogCisgICAgICogQHBhcmFtIGJ1bmRsZUdyb3VwCisgICAgICogICAgICAgICAgICBUaGUgbmV3IHtAbGluayBJTWVzc2FnZXNCdW5kbGVHcm91cH0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlNZXNzYWdlc0J1bmRsZUdyb3VwQ3JlYXRlZCgKKwkgICAgSU1lc3NhZ2VzQnVuZGxlR3JvdXAgYnVuZGxlR3JvdXApIHsKKwlpZiAocmVzb3VyY2VCdW5kbGVzLmNvbnRhaW5zS2V5KGJ1bmRsZUdyb3VwLmdldFJlc291cmNlQnVuZGxlSWQoKSkpIHsKKwkgICAgSU1lc3NhZ2VzQnVuZGxlR3JvdXAgb2xkYnVuZGxlR3JvdXAgPSByZXNvdXJjZUJ1bmRsZXMKKwkJICAgIC5nZXQoYnVuZGxlR3JvdXAuZ2V0UmVzb3VyY2VCdW5kbGVJZCgpKTsKKworCSAgICAvLyBub3QgdGhlIHNhbWUgb2JqZWN0CisJICAgIGlmICghZXF1YWxIYXNoKG9sZGJ1bmRsZUdyb3VwLCBidW5kbGVHcm91cCkpIHsKKwkJLy8gd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDIga2luZHMgb2YgcmVzb3VyY2VzOgorCQkvLyAxKSBQcm9wZXJ0eS1GaWxlCisJCS8vIDIpIEVjbGlwc2UtRWRpdG9yCisJCS8vIFdoZW4gZmlyc3QgMSkgaXMgdXNlZCwgYW5kIHNvbWUgb3BlcmF0aW9ucyB3aGVyZSBtYWRlLCB3ZQorCQkvLyBuZWVkIHRvCisJCS8vIHN5bmMgMikgd2hlbiBpdCBhcHBlYXJzIQorCQlib29sZWFuIG9sZEhhc1Byb3BlcnRpZXNTdHJhdGVneSA9IG9sZGJ1bmRsZUdyb3VwCisJCQkuaGFzUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5KCk7CisJCWJvb2xlYW4gbmV3SGFzUHJvcGVydGllc1N0cmF0ZWd5ID0gYnVuZGxlR3JvdXAKKwkJCS5oYXNQcm9wZXJ0aWVzRmlsZUdyb3VwU3RyYXRlZ3koKTsKKworCQkvLyBpbiB0aGlzIGNhc2UsIHRoZSBvbGQgb25lIGlzIG9ubHkgd3JpdGluZyB0byB0aGUgcHJvcGVydHkKKwkJLy8gZmlsZSwgbm90IHRoZSBlZGl0b3IKKwkJLy8gd2UgaGF2ZSB0byBzeW5jIHRoZW0gYW5kIHN0b3JlIHRoZSBidW5kbGUgd2l0aCB0aGUgZWRpdG9yIGFzCisJCS8vIHJlc291cmNlCisJCWlmIChvbGRIYXNQcm9wZXJ0aWVzU3RyYXRlZ3kgJiYgIW5ld0hhc1Byb3BlcnRpZXNTdHJhdGVneSkgeworCisJCSAgICBzeW5jQnVuZGxlcyhidW5kbGVHcm91cCwgb2xkYnVuZGxlR3JvdXApOworCQkgICAgcmVzb3VyY2VCdW5kbGVzLnB1dChidW5kbGVHcm91cC5nZXRSZXNvdXJjZUJ1bmRsZUlkKCksCisJCQkgICAgYnVuZGxlR3JvdXApOworCisJCSAgICBsb2dnZXIubG9nKAorCQkJICAgIExldmVsLklORk8sCisJCQkgICAgInN5bmM6ICIgKyBidW5kbGVHcm91cC5nZXRSZXNvdXJjZUJ1bmRsZUlkKCkKKwkJCQkgICAgKyAiIHdpdGggIgorCQkJCSAgICArIG9sZGJ1bmRsZUdyb3VwLmdldFJlc291cmNlQnVuZGxlSWQoKSk7CisKKwkJICAgIG9sZGJ1bmRsZUdyb3VwLmRpc3Bvc2UoKTsKKworCQl9IGVsc2UgaWYgKChvbGRIYXNQcm9wZXJ0aWVzU3RyYXRlZ3kgJiYgbmV3SGFzUHJvcGVydGllc1N0cmF0ZWd5KQorCQkJfHwgKCFvbGRIYXNQcm9wZXJ0aWVzU3RyYXRlZ3kgJiYgIW5ld0hhc1Byb3BlcnRpZXNTdHJhdGVneSkpIHsKKworCQkgICAgLy8gc3luY0J1bmRsZXMob2xkYnVuZGxlR3JvdXAsIGJ1bmRsZUdyb3VwKTsgZG8gbm90IG5lZWQKKwkJICAgIC8vIHRoYXQsIGJlY2F1c2Ugd2UgdGFrZSB0aGUgbmV3IG9uZQorCQkgICAgLy8gYW5kIHdlIGRvIHRoYXQsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIGNhY2hlIG9sZAorCQkgICAgLy8gVGV4dC1FZGl0b3IgaW5zdGFuY2VzLCB3aGljaCB3ZQorCQkgICAgLy8gZG8gbm90IG5lZWQgLT4gcmVhZCBvbmx5IHBoZW5vbWVub24KKwkJICAgIHJlc291cmNlQnVuZGxlcy5wdXQoYnVuZGxlR3JvdXAuZ2V0UmVzb3VyY2VCdW5kbGVJZCgpLAorCQkJICAgIGJ1bmRsZUdyb3VwKTsKKworCQkgICAgbG9nZ2VyLmxvZygKKwkJCSAgICBMZXZlbC5JTkZPLAorCQkJICAgICJyZXBsYWNlOiAiICsgYnVuZGxlR3JvdXAuZ2V0UmVzb3VyY2VCdW5kbGVJZCgpCisJCQkJICAgICsgIiB3aXRoICIKKwkJCQkgICAgKyBvbGRidW5kbGVHcm91cC5nZXRSZXNvdXJjZUJ1bmRsZUlkKCkpOworCisJCSAgICBvbGRidW5kbGVHcm91cC5kaXNwb3NlKCk7CisJCX0gZWxzZSB7CisJCSAgICAvLyBpbiB0aGlzIGNhc2Ugb3VyIG9sZCByZXNvdXJjZSBoYXMgYW4gRWRpdG9yU2l0ZSwgYnV0IG5vdAorCQkgICAgLy8gdGhlIG5ldyBvbmUKKwkJICAgIGxvZ2dlci5sb2coTGV2ZWwuSU5GTywKKwkJCSAgICAiZGlzcG9zZTogIiArIGJ1bmRsZUdyb3VwLmdldFJlc291cmNlQnVuZGxlSWQoKSk7CisKKwkJICAgIGJ1bmRsZUdyb3VwLmRpc3Bvc2UoKTsKKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgcmVzb3VyY2VCdW5kbGVzLnB1dChidW5kbGVHcm91cC5nZXRSZXNvdXJjZUJ1bmRsZUlkKCksIGJ1bmRsZUdyb3VwKTsKKworCSAgICBsb2dnZXIubG9nKExldmVsLklORk8sICJhZGQ6ICIgKyBidW5kbGVHcm91cC5nZXRSZXNvdXJjZUJ1bmRsZUlkKCkpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24sIHRoYXQgYSB7QGxpbmsgSU1lc3NhZ2VzQnVuZGxlR3JvdXB9IGhhcyBiZWVuIGRlbGV0ZWQhCisgICAgICogCisgICAgICogQHBhcmFtIGJ1bmRsZUdyb3VwCisgICAgICogICAgICAgICAgICBUaGUge0BsaW5rIElNZXNzYWdlc0J1bmRsZUdyb3VwfSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlNZXNzYWdlc0J1bmRsZUdyb3VwRGVsZXRlZCgKKwkgICAgSU1lc3NhZ2VzQnVuZGxlR3JvdXAgYnVuZGxlR3JvdXApIHsKKwlpZiAocmVzb3VyY2VCdW5kbGVzLmNvbnRhaW5zS2V5KGJ1bmRsZUdyb3VwLmdldFJlc291cmNlQnVuZGxlSWQoKSkpIHsKKwkgICAgaWYgKGVxdWFsSGFzaCgKKwkJICAgIHJlc291cmNlQnVuZGxlcy5nZXQoYnVuZGxlR3JvdXAuZ2V0UmVzb3VyY2VCdW5kbGVJZCgpKSwKKwkJICAgIGJ1bmRsZUdyb3VwKSkgeworCQlyZXNvdXJjZUJ1bmRsZXMucmVtb3ZlKGJ1bmRsZUdyb3VwLmdldFJlc291cmNlQnVuZGxlSWQoKSk7CisKKwkJZm9yIChJUmVzb3VyY2VEZWx0YUxpc3RlbmVyIGRlbHRhTGlzdGVuZXIgOiByZXNvdXJjZUxpc3RlbmVycykgeworCQkgICAgZGVsdGFMaXN0ZW5lci5vbkRlbGV0ZShidW5kbGVHcm91cCk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24sIHRoYXQgYSByZXNvdXJjZSBidW5kbGUgKD0ge0BsaW5rIE1lc3NhZ2VzQnVuZGxlfSkgaGF2ZSBiZWVuCisgICAgICogcmVtb3ZlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUKKyAgICAgKiAgICAgICAgICAgIFRoZSByZW1vdmVkIHtAbGluayBNZXNzYWdlc0J1bmRsZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlSZXNvdXJjZVJlbW92ZWQoSVJlc291cmNlIHJlc291cmNlQnVuZGxlKSB7CisJU3RyaW5nIHJlc291cmNlQnVuZGxlSWQgPSBOYW1lVXRpbHMuZ2V0UmVzb3VyY2VCdW5kbGVJZChyZXNvdXJjZUJ1bmRsZSk7CisKKwlJTWVzc2FnZXNCdW5kbGVHcm91cCBidW5kbGVHcm91cCA9IHJlc291cmNlQnVuZGxlcworCQkuZ2V0KHJlc291cmNlQnVuZGxlSWQpOworCisJaWYgKGJ1bmRsZUdyb3VwICE9IG51bGwpIHsKKwkgICAgTG9jYWxlIGxvY2FsZSA9IE5hbWVVdGlscy5nZXRMb2NhbGVCeU5hbWUoCisJCSAgICBOYW1lVXRpbHMuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKHJlc291cmNlQnVuZGxlKSwKKwkJICAgIHJlc291cmNlQnVuZGxlLmdldE5hbWUoKSk7CisJICAgIElNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSA9IGJ1bmRsZUdyb3VwCisJCSAgICAuZ2V0TWVzc2FnZXNCdW5kbGUobG9jYWxlKTsKKwkgICAgaWYgKG1lc3NhZ2VzQnVuZGxlICE9IG51bGwpIHsKKwkJYnVuZGxlR3JvdXAucmVtb3ZlTWVzc2FnZXNCdW5kbGUobWVzc2FnZXNCdW5kbGUpOworCSAgICB9CisKKwkgICAgZm9yIChJUmVzb3VyY2VEZWx0YUxpc3RlbmVyIGRlbHRhTGlzdGVuZXIgOiByZXNvdXJjZUxpc3RlbmVycykgeworCQlkZWx0YUxpc3RlbmVyLm9uRGVsZXRlKHJlc291cmNlQnVuZGxlSWQsIHJlc291cmNlQnVuZGxlKTsKKwkgICAgfQorCisJICAgIGlmIChidW5kbGVHcm91cC5nZXRNZXNzYWdlc0J1bmRsZUNvdW50KCkgPT0gMCkgeworCQlub3RpZnlNZXNzYWdlc0J1bmRsZUdyb3VwRGVsZXRlZChidW5kbGVHcm91cCk7CisJICAgIH0KKwl9CisKKwkvLyBUT0RPOiBtYXliZSBzYXZlIGFuZCByZWluaXQgdGhlIGVkaXRvcj8KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlY2F1c2UgQkFCRUwtQnVpbGRlciBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSAoYWRkcyAxIHggYW5kIHJlbW92ZXMgMiB4CisgICAgICogdGhlIFNBTUUge0BsaW5rIE1lc3NhZ2VzQnVuZGxlR3JvdXB9ISkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkQnVuZGxlR3JvdXAKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBJTWVzc2FnZXNCdW5kbGVHcm91cH0KKyAgICAgKiBAcGFyYW0gbmV3QnVuZGxlR3JvdXAKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBJTWVzc2FnZXNCdW5kbGVHcm91cH0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNhbWUge0BsaW5rIElNZXNzYWdlc0J1bmRsZUdyb3VwfSwgZWxzZQorICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGVxdWFsSGFzaChJTWVzc2FnZXNCdW5kbGVHcm91cCBvbGRCdW5kbGVHcm91cCwKKwkgICAgSU1lc3NhZ2VzQnVuZGxlR3JvdXAgbmV3QnVuZGxlR3JvdXApIHsKKwlyZXR1cm4gb2xkQnVuZGxlR3JvdXAuaGFzaENvZGUoKSA9PSBuZXdCdW5kbGVHcm91cC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcyBvbmx5IG9uZSB1c2UgY2FzZS4gSWYgd2Ugd29ya2VkIHdpdGggcHJvcGVydHktZmlsZSBhcyByZXNvdXJjZSBhbmQKKyAgICAgKiBhZnRlcndhcmRzIHRoZSBtZXNzYWdlcyBlZGl0b3IgcG9wcyBvcGVuLCB3ZSBuZWVkIHRvIHN5bmMgdGhlbSwgc28gdGhhdAorICAgICAqIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgcHJvcGVydHktZmlsZSB3b24ndCBnZXQgbG9zdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkQnVuZGxlR3JvdXAKKyAgICAgKiAgICAgICAgICAgIFRoZSBwcmlvciB7QGxpbmsgSU1lc3NhZ2VzQnVuZGxlR3JvdXB9CisgICAgICogQHBhcmFtIG5ld0J1bmRsZUdyb3VwCisgICAgICogICAgICAgICAgICBUaGUgcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3luY0J1bmRsZXMoSU1lc3NhZ2VzQnVuZGxlR3JvdXAgb2xkQnVuZGxlR3JvdXAsCisJICAgIElNZXNzYWdlc0J1bmRsZUdyb3VwIG5ld0J1bmRsZUdyb3VwKSB7CisJTGlzdDxJTWVzc2FnZXNCdW5kbGU+IGJ1bmRsZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8SU1lc3NhZ2VzQnVuZGxlPigpOworCUxpc3Q8SU1lc3NhZ2U+IGtleXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8SU1lc3NhZ2U+KCk7CisKKwlEaXJ0eUhhY2suc2V0RmlyZUVuYWJsZWQoZmFsc2UpOyAvLyBoZWJlbHQgQWJzdHJhY3RNZXNzYWdlTW9kZWwgYXVzCisJLy8gc29uc3Qgbe+/vXNzdGVuIHdpciBpbiBzZXRUZXh0IHZvbiBFY2xpcHNlUHJvcGVydGllc0VkaXRvclJlc291cmNlCisJLy8gZWluCisJLy8gYXN5bmNFeGVjIHp1bGFzc2VuCisKKwlmb3IgKElNZXNzYWdlc0J1bmRsZSBuZXdCdW5kbGUgOiBuZXdCdW5kbGVHcm91cC5nZXRNZXNzYWdlc0J1bmRsZXMoKSkgeworCSAgICBJTWVzc2FnZXNCdW5kbGUgb2xkQnVuZGxlID0gb2xkQnVuZGxlR3JvdXAKKwkJICAgIC5nZXRNZXNzYWdlc0J1bmRsZShuZXdCdW5kbGUuZ2V0TG9jYWxlKCkpOworCSAgICBpZiAob2xkQnVuZGxlID09IG51bGwpIHsgLy8gaXQncyBhIG5ldyBvbmUKKwkJb2xkQnVuZGxlR3JvdXAuYWRkTWVzc2FnZXNCdW5kbGUobmV3QnVuZGxlLmdldExvY2FsZSgpLAorCQkJbmV3QnVuZGxlKTsKKwkgICAgfSBlbHNlIHsgLy8gY2hlY2sga2V5cworCQlmb3IgKElNZXNzYWdlIG5ld01zZyA6IG5ld0J1bmRsZS5nZXRNZXNzYWdlcygpKSB7CisJCSAgICBpZiAob2xkQnVuZGxlLmdldE1lc3NhZ2UobmV3TXNnLmdldEtleSgpKSA9PSBudWxsKSB7CisJCQkvLyBuZXcgZW50cnksIGNyZWF0ZSBuZXcgbWVzc2FnZQorCQkJb2xkQnVuZGxlLmFkZE1lc3NhZ2UobmV3IE1lc3NhZ2UobmV3TXNnLmdldEtleSgpLAorCQkJCW5ld01zZy5nZXRMb2NhbGUoKSkpOworCQkgICAgfSBlbHNlIHsgLy8gdXBkYXRlIG9sZCBlbnRyaWVzCisJCQlJTWVzc2FnZSBvbGRNc2cgPSBvbGRCdW5kbGUuZ2V0TWVzc2FnZShuZXdNc2cuZ2V0S2V5KCkpOworCQkJaWYgKG9sZE1zZyA9PSBudWxsKSB7IC8vIGl0J3MgYSBuZXcgb25lCisJCQkgICAgb2xkQnVuZGxlLmFkZE1lc3NhZ2UobmV3TXNnKTsKKwkJCX0gZWxzZSB7IC8vIGNoZWNrIHZhbHVlCisJCQkgICAgb2xkTXNnLnNldENvbW1lbnQobmV3TXNnLmdldENvbW1lbnQoKSk7CisJCQkgICAgb2xkTXNnLnNldFRleHQobmV3TXNnLmdldFZhbHVlKCkpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKwkvLyBjaGVjayBrZXlzCisJZm9yIChJTWVzc2FnZXNCdW5kbGUgb2xkQnVuZGxlIDogb2xkQnVuZGxlR3JvdXAuZ2V0TWVzc2FnZXNCdW5kbGVzKCkpIHsKKwkgICAgSU1lc3NhZ2VzQnVuZGxlIG5ld0J1bmRsZSA9IG5ld0J1bmRsZUdyb3VwCisJCSAgICAuZ2V0TWVzc2FnZXNCdW5kbGUob2xkQnVuZGxlLmdldExvY2FsZSgpKTsKKwkgICAgaWYgKG5ld0J1bmRsZSA9PSBudWxsKSB7IC8vIHdlIGhhdmUgYW4gb2xkIG9uZQorCQlidW5kbGVzVG9SZW1vdmUuYWRkKG9sZEJ1bmRsZSk7CisJICAgIH0gZWxzZSB7CisJCWZvciAoSU1lc3NhZ2Ugb2xkTXNnIDogb2xkQnVuZGxlLmdldE1lc3NhZ2VzKCkpIHsKKwkJICAgIGlmIChuZXdCdW5kbGUuZ2V0TWVzc2FnZShvbGRNc2cuZ2V0S2V5KCkpID09IG51bGwpIHsKKwkJCWtleXNUb1JlbW92ZS5hZGQob2xkTXNnKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisJZm9yIChJTWVzc2FnZXNCdW5kbGUgYnVuZGxlIDogYnVuZGxlc1RvUmVtb3ZlKSB7CisJICAgIG9sZEJ1bmRsZUdyb3VwLnJlbW92ZU1lc3NhZ2VzQnVuZGxlKGJ1bmRsZSk7CisJfQorCisJZm9yIChJTWVzc2FnZSBtc2cgOiBrZXlzVG9SZW1vdmUpIHsKKwkgICAgSU1lc3NhZ2VzQnVuZGxlIG1iID0gb2xkQnVuZGxlR3JvdXAuZ2V0TWVzc2FnZXNCdW5kbGUobXNnCisJCSAgICAuZ2V0TG9jYWxlKCkpOworCSAgICBpZiAobWIgIT0gbnVsbCkgeworCQltYi5yZW1vdmVNZXNzYWdlKG1zZy5nZXRLZXkoKSk7CisJICAgIH0KKwl9CisKKwlEaXJ0eUhhY2suc2V0RmlyZUVuYWJsZWQodHJ1ZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBUYXBpSkkgbmVlZHMgdG8gZGVsZXRlIHN0aC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGVJZAorICAgICAqICAgICAgICAgICAgVGhlIHJlc291cmNlQnVuZGxlSWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxldGVNZXNzYWdlc0J1bmRsZUdyb3VwKFN0cmluZyByZXNvdXJjZUJ1bmRsZUlkKSB7CisJLy8gVE9ETzogVHJ5IHRvIHVuaWZ5IGl0IHNvbWUgdGltZQorCWlmIChyZXNvdXJjZUJ1bmRsZXMuY29udGFpbnNLZXkocmVzb3VyY2VCdW5kbGVJZCkpIHsKKwkgICAgcmVzb3VyY2VCdW5kbGVzLnJlbW92ZShyZXNvdXJjZUJ1bmRsZUlkKTsKKwl9IGVsc2UgeworCSAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwKKwkJICAgICJkZWxldGVNZXNzYWdlc0J1bmRsZUdyb3VwIHdpdGggbm9uLWV4aXN0aW5nIElkOiAiCisJCQkgICAgKyByZXNvdXJjZUJ1bmRsZUlkKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlSWQKKyAgICAgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZUJ1bmRsZUlkCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuYWdlciBrbm93cyB0aGUKKyAgICAgKiAgICAgICAgIHtAbGluayBNZXNzYWdlc0J1bmRsZUdyb3VwfSB3aXRoIHRoZSBpZCByZXNvdXJjZUJ1bmRsZUlkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNZXNzYWdlc0J1bmRsZUdyb3VwKFN0cmluZyByZXNvdXJjZUJ1bmRsZUlkKSB7CisJcmV0dXJuIHJlc291cmNlQnVuZGxlcy5jb250YWluc0tleShyZXNvdXJjZUJ1bmRsZUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJvamVjdAorICAgICAqICAgICAgICAgICAgVGhlIHByb2plY3QsIHdoaWNoIGlzIG1hbmFnZWQgYnkgdGhlIHtAbGluayBSQk1hbmFnZXJ9CisgICAgICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyB7QGxpbmsgUkJNYW5hZ2VyfSB0byB0aGUgcHJvamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUkJNYW5hZ2VyIGdldEluc3RhbmNlKElQcm9qZWN0IHByb2plY3QpIHsKKwkvLyBzZXQgaG9zdC1wcm9qZWN0CisJaWYgKFBERVV0aWxzLmlzRnJhZ21lbnQocHJvamVjdCkpIHsKKwkgICAgcHJvamVjdCA9IFBERVV0aWxzLmdldEZyYWdtZW50SG9zdChwcm9qZWN0KTsKKwl9CisKKwlJTlNUQU5DRSA9IG1hbmFnZXJNYXAuZ2V0KHByb2plY3QpOworCisJaWYgKElOU1RBTkNFID09IG51bGwpIHsKKwkgICAgSU5TVEFOQ0UgPSBuZXcgUkJNYW5hZ2VyKCk7CisJICAgIElOU1RBTkNFLnByb2plY3QgPSBwcm9qZWN0OworCSAgICBtYW5hZ2VyTWFwLnB1dChwcm9qZWN0LCBJTlNUQU5DRSk7CisJICAgIElOU1RBTkNFLmRldGVjdFJlc291cmNlQnVuZGxlcygpOworCX0KKworCXJldHVybiBJTlNUQU5DRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LCB3aGljaCBpcyBtYW5hZ2VkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAge0BsaW5rIFJCTWFuYWdlcn0KKyAgICAgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBSQk1hbmFnZXJ9IHRvIHRoZSBwcm9qZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSQk1hbmFnZXIgZ2V0SW5zdGFuY2UoU3RyaW5nIHByb2plY3ROYW1lKSB7CisJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogZ2V0QWxsV29ya3NwYWNlUHJvamVjdHModHJ1ZSkpIHsKKwkgICAgaWYgKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKKwkJLy8gY2hlY2sgaWYgdGhlIHByb2plY3ROYW1lIGlzIGEgZnJhZ21lbnQgYW5kIHJldHVybiB0aGUgbWFuYWdlcgorCQkvLyBmb3IgdGhlIGhvc3QKKwkJaWYgKFBERVV0aWxzLmlzRnJhZ21lbnQocHJvamVjdCkpIHsKKwkJICAgIHJldHVybiBnZXRJbnN0YW5jZShQREVVdGlscy5nZXRGcmFnbWVudEhvc3QocHJvamVjdCkpOworCQl9IGVsc2UgeworCQkgICAgcmV0dXJuIGdldEluc3RhbmNlKHByb2plY3QpOworCQl9CisJICAgIH0KKwl9CisJcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGlnbm9yZU5hdHVyZQorICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGludGVybmF0aW9uYWxpemF0aW9uIG5hdHVyZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIGlnbm9yZWQsIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogQHJldHVybiBBIHNldCBvZiBwcm9qZWN0cywgd2hpY2ggaGF2ZSB0aGUgbmF0dXJlIChpZ25vcmVOYXR1cmUgPT0gZmFsc2UpCisgICAgICogICAgICAgICBvciBub3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8SVByb2plY3Q+IGdldEFsbFdvcmtzcGFjZVByb2plY3RzKGJvb2xlYW4gaWdub3JlTmF0dXJlKSB7CisJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKKwkJLmdldFByb2plY3RzKCk7CisJU2V0PElQcm9qZWN0PiBwcm9qcyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOworCisJZm9yIChJUHJvamVjdCBwIDogcHJvamVjdHMpIHsKKwkgICAgdHJ5IHsKKwkJaWYgKHAuaXNPcGVuKCkgJiYgKGlnbm9yZU5hdHVyZSB8fCBwLmhhc05hdHVyZShUQVBJSklfTkFUVVJFKSkpIHsKKwkJICAgIHByb2pzLmFkZChwKTsKKwkJfQorCSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsCisJCQkiZ2V0QWxsV29ya3NwYWNlUHJvamVjdHMoLi4uKTogaGFzTmF0dXJlIGZhaWxlZCEiLCBlKTsKKwkgICAgfQorCX0KKwlyZXR1cm4gcHJvanM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBBbGwgc3VwcG9ydGVkIHByb2plY3RzLCB0aG9zZSB3aG8gaGF2ZSB0aGUgY29ycmVjdCBuYXR1cmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8SVByb2plY3Q+IGdldEFsbFN1cHBvcnRlZFByb2plY3RzKCkgeworCXJldHVybiBnZXRBbGxXb3Jrc3BhY2VQcm9qZWN0cyhmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB7QGxpbmsgSU1lc3NhZ2VzRWRpdG9yTGlzdGVuZXJ9IHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VzRWRpdG9yTGlzdGVuZXIoSU1lc3NhZ2VzRWRpdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwl0aGlzLmVkaXRvckxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAge0BsaW5rIElNZXNzYWdlc0VkaXRvckxpc3RlbmVyfSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlc0VkaXRvckxpc3RlbmVyKElNZXNzYWdlc0VkaXRvckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJdGhpcy5lZGl0b3JMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBJUmVzb3VyY2VEZWx0YUxpc3RlbmVyfSB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZURlbHRhTGlzdGVuZXIoSVJlc291cmNlRGVsdGFMaXN0ZW5lciBsaXN0ZW5lcikgeworCXRoaXMucmVzb3VyY2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBJUmVzb3VyY2VEZWx0YUxpc3RlbmVyfSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZURlbHRhTGlzdGVuZXIoSVJlc291cmNlRGVsdGFMaXN0ZW5lciBsaXN0ZW5lcikgeworCXRoaXMucmVzb3VyY2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlOiBNZXNzYWdlc0VkaXRvciBoYXMgYmVlbiBzYXZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVFZGl0b3JTYXZlZCgpIHsKKwlmb3IgKElNZXNzYWdlc0VkaXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5lZGl0b3JMaXN0ZW5lcnMpIHsKKwkgICAgbGlzdGVuZXIub25TYXZlKCk7CisJfQorCWxvZ2dlci5sb2coTGV2ZWwuSU5GTywgImZpcmVFZGl0b3JTYXZlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmU6IE1lc3NhZ2VzRWRpdG9yIGhhcyBiZWVuIG1vZGlmaWVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUVkaXRvckNoYW5nZWQoKSB7CisJZm9yIChJTWVzc2FnZXNFZGl0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMuZWRpdG9yTGlzdGVuZXJzKSB7CisJICAgIGxpc3RlbmVyLm9uTW9kaWZ5KCk7CisJfQorCWxvZ2dlci5sb2coTGV2ZWwuSU5GTywgImZpcmVFZGl0b3JDaGFuZ2VkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZToge0BsaW5rIElNZXNzYWdlc0J1bmRsZX0gaGFzIGJlZW4gZWRpdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZVJlc291cmNlQ2hhbmdlZChJTWVzc2FnZXNCdW5kbGUgYnVuZGxlKSB7CisJZm9yIChJTWVzc2FnZXNFZGl0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMuZWRpdG9yTGlzdGVuZXJzKSB7CisJICAgIGxpc3RlbmVyLm9uUmVzb3VyY2VDaGFuZ2VkKGJ1bmRsZSk7CisJICAgIGxvZ2dlci5sb2coTGV2ZWwuSU5GTywgImZpcmVSZXNvdXJjZUNoYW5nZWQiCisJCSAgICArIGJ1bmRsZS5nZXRSZXNvdXJjZSgpLmdldFJlc291cmNlTG9jYXRpb25MYWJlbCgpKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZWN0cyBhbGwgcmVzb3VyY2UgYnVuZGxlcywgd2hpY2ggd2Ugd2FudCB0byB3b3JrIHdpdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGV0ZWN0UmVzb3VyY2VCdW5kbGVzKCkgeworCXRyeSB7CisJICAgIHByb2plY3QuYWNjZXB0KG5ldyBSZXNvdXJjZUJ1bmRsZURldGVjdGlvblZpc2l0b3IodGhpcykpOworCisJICAgIElQcm9qZWN0W10gZnJhZ21lbnRzID0gUERFVXRpbHMubG9va3VwRnJhZ21lbnQocHJvamVjdCk7CisJICAgIGlmIChmcmFnbWVudHMgIT0gbnVsbCkgeworCQlmb3IgKElQcm9qZWN0IHAgOiBmcmFnbWVudHMpIHsKKwkJICAgIHAuYWNjZXB0KG5ldyBSZXNvdXJjZUJ1bmRsZURldGVjdGlvblZpc2l0b3IodGhpcykpOworCQl9CisKKwkgICAgfQorCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCSAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgImRldGVjdFJlc291cmNlQnVuZGxlczogYWNjZXB0IGZhaWxlZCEiLCBlKTsKKwl9CisgICAgfQorCisgICAgLy8gcGFzc2l2ZSBsb2FkaW5nIC0+IHNlZSBkZXRlY3RSZXNvdXJjZUJ1bmRsZXMKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IHtAbGluayAjZGV0ZWN0UmVzb3VyY2VCdW5kbGVzKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJ1bmRsZVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgeworCS8vIGNyZWF0ZSBpdCB3aXRoIE1lc3NhZ2VzQnVuZGxlRmFjdG9yeSBvciByZWFkIGZyb20gcmVzb3VyY2UhCisJLy8gd2UgY2FuIG9wdGltaXplIHRoYXQsIG5vdyB3ZSBjcmVhdGUgYSBidW5kbGUgZ3JvdXAgZm9yIGVhY2ggYnVuZGxlCisJLy8gd2Ugc2hvdWxkIGNyZWF0ZSBhIGJ1bmRsZSBncm91cCBvbmx5IG9uY2UhCisKKwlTdHJpbmcgcmVzb3VyY2VCdW5kbGVJZCA9IE5hbWVVdGlscy5nZXRSZXNvdXJjZUJ1bmRsZUlkKHJlc291cmNlKTsKKwlpZiAoIXJlc291cmNlQnVuZGxlcy5jb250YWluc0tleShyZXNvdXJjZUJ1bmRsZUlkKSkgeworCSAgICAvLyBpZiB3ZSBkbyBub3QgaGF2ZSB0aGlzIGNvbmRpdGlvbiwgdGhlbiB5b3Ugd2lsbCBiZSBkb29tZWQgd2l0aAorCSAgICAvLyByZXNvdXJjZSBvdXQgb2Ygc3luY3MsIGJlY2F1c2UgaGVyZSB3ZSBpbnN0YW50aWF0ZQorCSAgICAvLyBQcm9wZXJ0aWVzRmlsZVJlc291cmNlcywgd2hpY2ggaGF2ZSBhbiBldmlsIHNldFRleHQtTWV0aG9kCisJICAgIE1lc3NhZ2VzQnVuZGxlR3JvdXBGYWN0b3J5LmNyZWF0ZUJ1bmRsZUdyb3VwKHJlc291cmNlKTsKKworCSAgICBsb2dnZXIubG9nKExldmVsLklORk8sICJhZGRCdW5kbGVSZXNvdXJjZSAocGFzc2l2ZSBsb2FkaW5nKTogIgorCQkgICAgKyByZXNvdXJjZS5nZXROYW1lKCkpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvRmlsZShJTWVzc2FnZXNCdW5kbGVHcm91cCBidW5kbGVHcm91cCkgeworCWZvciAoSU1lc3NhZ2VzQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZUdyb3VwLmdldE1lc3NhZ2VzQnVuZGxlcygpKSB7CisJICAgIEZpbGVVdGlscy53cml0ZVRvRmlsZShidW5kbGUpOworCSAgICBmaXJlUmVzb3VyY2VDaGFuZ2VkKGJ1bmRsZSk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9tYW5hZ2VyL1Jlc291cmNlQnVuZGxlRGV0ZWN0aW9uVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL21hbmFnZXIvUmVzb3VyY2VCdW5kbGVEZXRlY3Rpb25WaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1YzM0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9tYW5hZ2VyL1Jlc291cmNlQnVuZGxlRGV0ZWN0aW9uVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBSZWl0ZXJlciwgQWxleGVqIFN0cmVsem93LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1hcnRpbiBSZWl0ZXJlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEFsZXhlaiBTdHJlbHpvdyAtIGRldGVjdGlvbiBpZiBpc1Jlc291cmNlQnVuZGxlRmlsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UubWFuYWdlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVEZXRlY3Rpb25WaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlVmlzaXRvciwKKwlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCisgICAgcHJpdmF0ZSBSQk1hbmFnZXIgbWFuYWdlciA9IG51bGw7CisKKyAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGVEZXRlY3Rpb25WaXNpdG9yKFJCTWFuYWdlciBtYW5hZ2VyKSB7CisJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl0cnkgeworCSAgICBpZiAoaXNSZXNvdXJjZUJ1bmRsZUZpbGUocmVzb3VyY2UpKSB7CisJCW1hbmFnZXIuYWRkQnVuZGxlUmVzb3VyY2UocmVzb3VyY2UpOworCQlyZXR1cm4gZmFsc2U7CisJICAgIH0gZWxzZQorCQlyZXR1cm4gdHJ1ZTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCSAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKworCWlmIChpc1Jlc291cmNlQnVuZGxlRmlsZShyZXNvdXJjZSkpIHsKKwkgICAgLy8gUmVzb3VyY2VCdW5kbGVNYW5hZ2VyLmdldE1hbmFnZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKS5idW5kbGVSZXNvdXJjZU1vZGlmaWVkKGRlbHRhKTsKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFJCX01BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5iYWJlbC50YXBpamkudG9vbHMuY29yZS5SZXNvdXJjZUJ1bmRsZUF1ZGl0TWFya2VyIjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1Jlc291cmNlQnVuZGxlRmlsZShJUmVzb3VyY2UgZmlsZSkgeworCWJvb2xlYW4gaXNWYWxpZWQgPSBmYWxzZTsKKworCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZSBpbnN0YW5jZW9mIElGaWxlICYmICFmaWxlLmlzRGVyaXZlZCgpCisJCSYmIGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwKKwkJJiYgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgicHJvcGVydGllcyIpKSB7CisJICAgIGlzVmFsaWVkID0gdHJ1ZTsKKworCSAgICBMaXN0PENoZWNrSXRlbT4gbGlzdCA9IGdldEJsYWNrbGlzdEl0ZW1zKCk7CisJICAgIGZvciAoQ2hlY2tJdGVtIGl0ZW0gOiBsaXN0KSB7CisJCWlmIChpdGVtLmdldENoZWNrZWQoKQorCQkJJiYgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkKKwkJCQkubWF0Y2hlcyhpdGVtLmdldE5hbWUoKSkpIHsKKwkJICAgIGlzVmFsaWVkID0gZmFsc2U7CisKKwkJICAgIC8vIGlmIHByb3BlcnRpZXMtZmlsZSBpcyBub3QgUkItZmlsZSBhbmQgaGFzCisJCSAgICAvLyBSZXNvdWNlQnVuZGxlTWFya2VyLCBkZWxldGVzIGFsbCBSZXNvdWNlQnVuZGxlTWFya2VyIG9mCisJCSAgICAvLyB0aGUgZmlsZQorCQkgICAgaWYgKGhhc1Jlc291cmNlQnVuZGxlTWFya2VyKGZpbGUpKQorCQkJdHJ5IHsKKwkJCSAgICBmaWxlLmRlbGV0ZU1hcmtlcnMoUkJfTUFSS0VSX0lELCB0cnVlLAorCQkJCSAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkgICAgfQorCX0KKworCXJldHVybiBpc1ZhbGllZDsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Q2hlY2tJdGVtPiBnZXRCbGFja2xpc3RJdGVtcygpIHsKKwlJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKQorCQkuZ2V0Q29uZmlndXJhdGlvbigpOworCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKKwkgICAgcmV0dXJuIGNvbnZlcnRTdHJpbmdUb0xpc3QoY29uZmlndXJhdGlvbi5nZXROb25SYlBhdHRlcm4oKSk7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8Q2hlY2tJdGVtPigpOworCX0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSID0gIjsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfREVMSU1JVEVSID0gIjoiOworCisgICAgcHJpdmF0ZSBMaXN0PENoZWNrSXRlbT4gY29udmVydFN0cmluZ1RvTGlzdChTdHJpbmcgc3RyaW5nKSB7CisJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLCBERUxJTUlURVIpOworCWludCB0b2tlbkNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7CisJTGlzdDxDaGVja0l0ZW0+IGVsZW1lbnRzID0gbmV3IExpbmtlZExpc3Q8Q2hlY2tJdGVtPigpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbkNvdW50OyBpKyspIHsKKwkgICAgU3RyaW5nVG9rZW5pemVyIGF0dHJpYnV0ZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCisJCSAgICB0b2tlbml6ZXIubmV4dFRva2VuKCksIEFUVFJJQlVURV9ERUxJTUlURVIpOworCSAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5uZXh0VG9rZW4oKTsKKwkgICAgYm9vbGVhbiBjaGVja2VkOworCSAgICBpZiAoYXR0cmlidXRlLm5leHRUb2tlbigpLmVxdWFscygidHJ1ZSIpKQorCQljaGVja2VkID0gdHJ1ZTsKKwkgICAgZWxzZQorCQljaGVja2VkID0gZmFsc2U7CisKKwkgICAgZWxlbWVudHMuYWRkKG5ldyBDaGVja0l0ZW0obmFtZSwgY2hlY2tlZCkpOworCX0KKwlyZXR1cm4gZWxlbWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgYSBSQi1maWxlIGhhcyBhIHByb2JsZW0tbWFya2VyCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VCdW5kbGVNYXJrZXIoSVJlc291cmNlIHIpIHsKKwl0cnkgeworCSAgICBpZiAoci5maW5kTWFya2VycyhSQl9NQVJLRVJfSUQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSkubGVuZ3RoID4gMCkKKwkJcmV0dXJuIHRydWU7CisJICAgIGVsc2UKKwkJcmV0dXJuIGZhbHNlOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ2hlY2tJdGVtIHsKKwlib29sZWFuIGNoZWNrZWQ7CisJU3RyaW5nIG5hbWU7CisKKwlwdWJsaWMgQ2hlY2tJdGVtKFN0cmluZyBpdGVtLCBib29sZWFuIGNoZWNrZWQpIHsKKwkgICAgdGhpcy5uYW1lID0gaXRlbTsKKwkgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICAgIHJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyBib29sZWFuIGdldENoZWNrZWQoKSB7CisJICAgIHJldHVybiBjaGVja2VkOworCX0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9JTWVzc2FnZXNSZXNvdXJjZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL0lNZXNzYWdlc1Jlc291cmNlLmphdmEKaW5kZXggNzRiNWUzZi4uY2ExNmRmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL0lNZXNzYWdlc1Jlc291cmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL0lNZXNzYWdlc1Jlc291cmNlLmphdmEKQEAgLTEyLDU2ICsxMiw3NSBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZTsKIAogLyoqCiAgKiBDbGFzcyBhYnN0cmFjdGluZyB0aGUgdW5kZXJseWluZyBuYXRpdmUgc3RvcmFnZSBtZWNoYW5pc20gZm9yIHBlcnNpc3RpbmcKLSAqIGludGVybmF0aW9uYWxpc2VkIHRleHQgbWVzc2FnZXMuICAKKyAqIGludGVybmF0aW9uYWxpc2VkIHRleHQgbWVzc2FnZXMuCisgKiAKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZQogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlc1Jlc291cmNlIHsKIAogCS8qKgogCSAqIEdldHMgdGhlIHJlc291cmNlIGxvY2FsZS4KKwkgKiAKIAkgKiBAcmV0dXJuIGxvY2FsZQogCSAqLwotICAgIExvY2FsZSBnZXRMb2NhbGUoKTsKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBhYnN0cmFjdGVkIGJ5IHRoaXMgcmVzb3VyY2UgKGUuZy4gYSBGaWxlKS4KLSAgICAgKiBAcmV0dXJuIHNvdXJjZSBvYmplY3QKLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0U291cmNlKCk7Ci0gICAgLyoqCi0gICAgICogU2VyaWFsaXplcyBhIHtAbGluayBNZXNzYWdlc0J1bmRsZX0gaW5zdGFuY2UgdG8gaXRzIG5hdGl2ZSBmb3JtYXQuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VzQnVuZGxlIHRoZSBNZXNzYWdlc0J1bmRsZSB0byBzZXJpYWxpemUKLSAgICAgKi8KLSAgICB2b2lkIHNlcmlhbGl6ZShNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSk7Ci0gICAgLyoqCi0gICAgICogRGVzZXJpYWxpemVzIGEge0BsaW5rIE1lc3NhZ2VzQnVuZGxlfSBpbnN0YW5jZSBmcm9tIGl0cyBuYXRpdmUgZm9ybWF0LgotICAgICAqIEBwYXJhbSBtZXNzYWdlc0J1bmRsZSB0aGUgTWVzc2FnZXNCdW5kbGUgdG8gZGVzZXJpYWxpemUKLSAgICAgKi8KLSAgICB2b2lkIGRlc2VyaWFsaXplKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlKTsKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbWVzc2FnZXMgcmVzb3VyY2UgbGlzdGVuZXIuICBJbXBsZW1lbnRvcnMgYXJlIHJlcXVpcmVkIHRvIG5vdGlmeQotICAgICAqIGxpc3RlbmVycyBvZiBjaGFuZ2VzIHdpdGhpbiB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICB2b2lkIGFkZE1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKLSAgICAJCUlNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBtZXNzYWdlcyByZXNvdXJjZSBsaXN0ZW5lci4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIoCi0gICAgCQlJTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBsb2NhdGlvbiBsYWJlbC4gb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqLwotICAgIFN0cmluZyBnZXRSZXNvdXJjZUxvY2F0aW9uTGFiZWwoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZ3JvdXAgaXQgYmVsb25ncyB0byBpcyBkaXNwb3NlZC4KLSAgICAgKi8KLSAgICB2b2lkIGRpc3Bvc2UoKTsKLSAgICAKKwlMb2NhbGUgZ2V0TG9jYWxlKCk7CisKKwkvKioKKwkgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBhYnN0cmFjdGVkIGJ5IHRoaXMgcmVzb3VyY2UgKGUuZy4gYSBGaWxlKS4KKwkgKiAKKwkgKiBAcmV0dXJuIHNvdXJjZSBvYmplY3QKKwkgKi8KKwlPYmplY3QgZ2V0U291cmNlKCk7CisKKwkvKioKKwkgKiBTZXJpYWxpemVzIGEge0BsaW5rIE1lc3NhZ2VzQnVuZGxlfSBpbnN0YW5jZSB0byBpdHMgbmF0aXZlIGZvcm1hdC4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZXNCdW5kbGUKKwkgKiAgICAgICAgICAgIHRoZSBNZXNzYWdlc0J1bmRsZSB0byBzZXJpYWxpemUKKwkgKi8KKwl2b2lkIHNlcmlhbGl6ZShJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpOworCisJLyoqCisJICogRGVzZXJpYWxpemVzIGEge0BsaW5rIE1lc3NhZ2VzQnVuZGxlfSBpbnN0YW5jZSBmcm9tIGl0cyBuYXRpdmUgZm9ybWF0LgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlc0J1bmRsZQorCSAqICAgICAgICAgICAgdGhlIE1lc3NhZ2VzQnVuZGxlIHRvIGRlc2VyaWFsaXplCisJICovCisJdm9pZCBkZXNlcmlhbGl6ZShJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpOworCisJLyoqCisJICogQWRkcyBhIG1lc3NhZ2VzIHJlc291cmNlIGxpc3RlbmVyLiBJbXBsZW1lbnRvcnMgYXJlIHJlcXVpcmVkIHRvIG5vdGlmeQorCSAqIGxpc3RlbmVycyBvZiBjaGFuZ2VzIHdpdGhpbiB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyCisJICovCisJdm9pZCBhZGRNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIoCisJICAgICAgICBJTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCS8qKgorCSAqIFJlbW92ZXMgYSBtZXNzYWdlcyByZXNvdXJjZSBsaXN0ZW5lci4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lcgorCSAqLworCXZvaWQgcmVtb3ZlTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAorCSAgICAgICAgSU1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKwkvKioKKwkgKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBsb2NhdGlvbiBsYWJlbC4gb3IgbnVsbCBpZiB1bmtub3duLgorCSAqLworCVN0cmluZyBnZXRSZXNvdXJjZUxvY2F0aW9uTGFiZWwoKTsKKworCS8qKgorCSAqIENhbGxlZCB3aGVuIHRoZSBncm91cCBpdCBiZWxvbmdzIHRvIGlzIGRpc3Bvc2VkLgorCSAqLworCXZvaWQgZGlzcG9zZSgpOworCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2UvUHJvcGVydGllc0ZpbGVSZXNvdXJjZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL1Byb3BlcnRpZXNGaWxlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhOTc3Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2UvUHJvcGVydGllc0ZpbGVSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGFzY2FsIEVzc2llbWJyZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5Qcm9wZXJ0aWVzRGVzZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIuUHJvcGVydGllc1NlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS51dGlsLkZpbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWwuRmlsZU1vbml0b3I7Ci0KLQotLyoqCi0gKiBQcm9wZXJ0aWVzIGZpbGUsIHdoZXJlIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgaXMgYSByZWd1bGFyIHtAbGluayBGaWxlfS4KLSAqIEZvciBmaWxlcyByZWZlcmVuY2VkIHRocm91Z2ggRWNsaXBzZSB3b3Jrc3BhY2UsIGltcGxlbWVudG9ycyBzaG91bGQKLSAqIHVzZSB7QGxpbmsgUHJvcGVydGllc0lGaWxlUmVzb3VyY2V9LgotICogCi0gKiBAYXV0aG9yIFBhc2NhbCBFc3NpZW1icmUKLSAqIEBzZWUgUHJvcGVydGllc0lGaWxlUmVzb3VyY2UKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNGaWxlUmVzb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZSB7Ci0KLSAgICBwcml2YXRlIEZpbGUgZmlsZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSByZXNvdXJjZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0gc2VyaWFsaXplciByZXNvdXJjZSBzZXJpYWxpemVyCi0gICAgICogQHBhcmFtIGRlc2VyaWFsaXplciByZXNvdXJjZSBkZXNlcmlhbGl6ZXIKLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgdW5kZXJseWluZyBmaWxlCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnRpZXNGaWxlUmVzb3VyY2UoCi0gICAgICAgICAgICBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgUHJvcGVydGllc1NlcmlhbGl6ZXIgc2VyaWFsaXplciwKLSAgICAgICAgICAgIFByb3BlcnRpZXNEZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyLAotICAgICAgICAgICAgRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIobG9jYWxlLCBzZXJpYWxpemVyLCBkZXNlcmlhbGl6ZXIpOwotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICBGaWxlTW9uaXRvci5nZXRJbnN0YW5jZSgpLmFkZEZpbGVDaGFuZ2VMaXN0ZW5lcihuZXcgRmlsZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsZUNoYW5nZWQoZmluYWwgRmlsZSBjaGFuZ2VkRmlsZSkgewotICAgICAgICAgICAgICAgIGZpcmVSZXNvdXJjZUNoYW5nZShQcm9wZXJ0aWVzRmlsZVJlc291cmNlLnRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBmaWxlLCAyMDAwKTsgIC8vVE9ETyBtYWtlIGZpbGUgc2NhbiBkZWxheSBjb25maWd1cmFibGUKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZQotICAgICAqIAkJCSNnZXRUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIEZpbGVSZWFkZXIgaW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBTdHJpbmdXcml0ZXIgb3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0gICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBpbnQgYzsKLSAgICAgICAgICAgIHdoaWxlICgoYyA9IGlucHV0U3RyZWFtLnJlYWQoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vVE9ETyBoYW5kbGUgYmV0dGVyLgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZ2V0IHByb3BlcnRpZXMgZmlsZSB0ZXh0LiBIYW5kbGUgYmV0dGVyLiIsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VSZWFkZXIoaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgY2xvc2VXcml0ZXIob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuQWJzdHJhY3RQcm9wZXJ0aWVzUmVzb3VyY2UKLSAgICAgKiAJCSNzZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgY29udGVudCkgewotICAgICAgICBTdHJpbmdSZWFkZXIgaW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBGaWxlV3JpdGVyIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBTdHJpbmdSZWFkZXIoY29udGVudCk7Ci0gICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZVdyaXRlcihmaWxlKTsKLSAgICAgICAgICAgIGludCBjOwotICAgICAgICAgICAgd2hpbGUgKChjID0gaW5wdXRTdHJlYW0ucmVhZCgpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9UT0RPIGhhbmRsZSBiZXR0ZXIuCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBnZXQgcHJvcGVydGllcyBmaWxlIHRleHQuIEhhbmRsZSBiZXR0ZXIuIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBjbG9zZVdyaXRlcihvdXRwdXRTdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UKLSAgICAgKiAJCQkuSU1lc3NhZ2VzUmVzb3VyY2UjZ2V0U291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJlc291cmNlIGxvY2F0aW9uIGxhYmVsLiBvciBudWxsIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUxvY2F0aW9uTGFiZWwoKSB7Ci0gICAgCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgIH0KLSAgICAKLSAgICAvL1RPRE8gbW92ZSB0byB1dGlsIGNsYXNzIGZvciBjb252aW5pZW5jZT8/PwotICAgIHByaXZhdGUgdm9pZCBjbG9zZVdyaXRlcihXcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL1RPRE8gaGFuZGxlIGJldHRlci4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNsb3NlIHdyaXRlciBzdHJlYW0uIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9UT0RPIG1vdmUgdG8gdXRpbCBjbGFzcyBmb3IgY29udmluaWVuY2U/Pz8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZVJlYWRlcihSZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL1RPRE8gaGFuZGxlIGJldHRlci4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNsb3NlIHJlYWRlci4iLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYmVmb3JlIHRoaXMgb2JqZWN0IHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAqIE5vdGhpbmcgdG8gZG86IHdlIHdlcmUgbm90IGxpc3RlbmluZyB0byBjaGFuZ2VzIHRvIHRoaXMgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIAkvL25vdGhpbmcgdG8gZG8uCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL0Fic3RyYWN0TWVzc2FnZXNSZXNvdXJjZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL2ludGVybmFsL0Fic3RyYWN0TWVzc2FnZXNSZXNvdXJjZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9BYnN0cmFjdE1lc3NhZ2VzUmVzb3VyY2UuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL2ludGVybmFsL0Fic3RyYWN0TWVzc2FnZXNSZXNvdXJjZS5qYXZhCmluZGV4IGQ1MjQ5YWYuLjNmMTg5OTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9BYnN0cmFjdE1lc3NhZ2VzUmVzb3VyY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2UvaW50ZXJuYWwvQWJzdHJhY3RNZXNzYWdlc1Jlc291cmNlLmphdmEKQEAgLTgsMTIgKzgsMTUgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZTsKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLklNZXNzYWdlc1Jlc291cmNlOworCiAvKioKICAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgSU1lc3NhZ2VzUmVzb3VyY2V9IGJvdW5kIHRvIGEgbG9jYWxlCiAgKiBhbmQgcHJvdmlkaW5nIHdheXMgdG8gYWRkIGFuZCByZW1vdmUge0BsaW5rIElNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXJ9CkBAIC00Miw3ICs0NSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2UjCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2UjCiAgICAgICogICAgICAgICAgYWRkTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAogICAgICAqICAgICAgICAgIAkJb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlCiAgICAgICogICAgICAgICAgICAgICAgICAJCS5JTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKQpAQCAtNTIsMTAgKzU1LDkgQEAKICAgICAgICAgbGlzdGVuZXJzLmFkZCgwLCBsaXN0ZW5lcik7CiAgICAgfQogICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLklNZXNzYWdlc1Jlc291cmNlIworICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLnJlc291cmNlLklNZXNzYWdlc1Jlc291cmNlIwogICAgICAqICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKLSAgICAgKiAgICAgICAgICAJCW9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZQotICAgICAqICAgICAgICAgICAgICAgICAgCQkucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcikKKyAgICAgKiAgICAgICAgICAJCW9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5JTWVzc2FnZXNSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VzUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKICAgICAgICAgICAgIElNZXNzYWdlc1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL2ludGVybmFsL0Fic3RyYWN0UHJvcGVydGllc1Jlc291cmNlLmphdmEKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL0Fic3RyYWN0UHJvcGVydGllc1Jlc291cmNlLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9pbnRlcm5hbC9BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZS5qYXZhCmluZGV4IGE5ODY1ZGUuLmZmOTBhZGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9pbnRlcm5hbC9BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZS5qYXZhCkBAIC04LDEyICs4LDEyIEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLlByb3BlcnRpZXNEZXNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5Qcm9wZXJ0aWVzU2VyaWFsaXplcjsKIApAQCAtNDcsMTggKzQ3LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2Ujc2VyaWFsaXplKAotICAgICAqICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGUpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2Ujc2VyaWFsaXplKAorICAgICAqICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGUpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlKSB7CisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKElNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgewogICAgICAgICBzZXRUZXh0KHNlcmlhbGl6ZXIuc2VyaWFsaXplKG1lc3NhZ2VzQnVuZGxlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2UKLSAgICAgKiAJCSNkZXNlcmlhbGl6ZShvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGUpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2UKKyAgICAgKiAJCSNkZXNlcmlhbGl6ZShvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGUpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpIHsKKyAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpIHsKICAgICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKG1lc3NhZ2VzQnVuZGxlLCBnZXRUZXh0KCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL2ludGVybmFsL1Byb3BlcnRpZXNGaWxlUmVzb3VyY2UuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9pbnRlcm5hbC9Qcm9wZXJ0aWVzRmlsZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzZGQ1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9pbnRlcm5hbC9Qcm9wZXJ0aWVzRmlsZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGFzY2FsIEVzc2llbWJyZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5Qcm9wZXJ0aWVzRGVzZXJpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIuUHJvcGVydGllc1NlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS51dGlsLkZpbGVDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWwuRmlsZU1vbml0b3I7CisKKy8qKgorICogUHJvcGVydGllcyBmaWxlLCB3aGVyZSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGlzIGEgcmVndWxhciB7QGxpbmsgRmlsZX0uIEZvcgorICogZmlsZXMgcmVmZXJlbmNlZCB0aHJvdWdoIEVjbGlwc2Ugd29ya3NwYWNlLCBpbXBsZW1lbnRvcnMgc2hvdWxkIHVzZQorICoge0BsaW5rIFByb3BlcnRpZXNJRmlsZVJlc291cmNlfS4KKyAqIAorICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlCisgKiBAc2VlIFByb3BlcnRpZXNJRmlsZVJlc291cmNlCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzRmlsZVJlc291cmNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0aWVzUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisKKyAgICBwcml2YXRlIEZpbGVDaGFuZ2VMaXN0ZW5lckltcGwgZmlsZUNoYW5nZUxpc3RlbmVyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIHJlc291cmNlIGxvY2FsZQorICAgICAqIEBwYXJhbSBzZXJpYWxpemVyCisgICAgICogICAgICAgICAgICByZXNvdXJjZSBzZXJpYWxpemVyCisgICAgICogQHBhcmFtIGRlc2VyaWFsaXplcgorICAgICAqICAgICAgICAgICAgcmVzb3VyY2UgZGVzZXJpYWxpemVyCisgICAgICogQHBhcmFtIGZpbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB1bmRlcmx5aW5nIGZpbGUKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzRmlsZVJlc291cmNlKExvY2FsZSBsb2NhbGUsCisJICAgIFByb3BlcnRpZXNTZXJpYWxpemVyIHNlcmlhbGl6ZXIsCisJICAgIFByb3BlcnRpZXNEZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyLCBGaWxlIGZpbGUpCisJICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCXN1cGVyKGxvY2FsZSwgc2VyaWFsaXplciwgZGVzZXJpYWxpemVyKTsKKwl0aGlzLmZpbGUgPSBmaWxlOworCXRoaXMuZmlsZUNoYW5nZUxpc3RlbmVyID0gbmV3IEZpbGVDaGFuZ2VMaXN0ZW5lckltcGwoKTsKKworCUZpbGVNb25pdG9yLmdldEluc3RhbmNlKCkuYWRkRmlsZUNoYW5nZUxpc3RlbmVyKAorCQl0aGlzLmZpbGVDaGFuZ2VMaXN0ZW5lciwgZmlsZSwgMjAwMCk7IC8vIFRPRE8gbWFrZSBmaWxlIHNjYW4KKwkJCQkJCSAgICAgIC8vIGRlbGF5IGNvbmZpZ3VyYWJsZQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLnJlc291cmNlLkFic3RyYWN0UHJvcGVydGllc1Jlc291cmNlCisgICAgICogICAgICAjZ2V0VGV4dCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCUZpbGVSZWFkZXIgaW5wdXRTdHJlYW0gPSBudWxsOworCVN0cmluZ1dyaXRlciBvdXRwdXRTdHJlYW0gPSBudWxsOworCXRyeSB7CisJICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworCQlyZXR1cm4gIiI7CisJICAgIH0KKwkgICAgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKKwkgICAgb3V0cHV0U3RyZWFtID0gbmV3IFN0cmluZ1dyaXRlcigpOworCSAgICBpbnQgYzsKKwkgICAgd2hpbGUgKChjID0gaW5wdXRTdHJlYW0ucmVhZCgpKSAhPSAtMSkgeworCQlvdXRwdXRTdHJlYW0ud3JpdGUoYyk7CisJICAgIH0KKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIC8vIFRPRE8gaGFuZGxlIGJldHRlci4KKwkgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisJCSAgICAiQ2Fubm90IGdldCBwcm9wZXJ0aWVzIGZpbGUgdGV4dC4gSGFuZGxlIGJldHRlci4iLCBlKTsKKwl9IGZpbmFsbHkgeworCSAgICBjbG9zZVJlYWRlcihpbnB1dFN0cmVhbSk7CisJICAgIGNsb3NlV3JpdGVyKG91dHB1dFN0cmVhbSk7CisJfQorCXJldHVybiBvdXRwdXRTdHJlYW0udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5yZXNvdXJjZS5BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZQorICAgICAqICAgICAgI3NldFRleHQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBjb250ZW50KSB7CisJU3RyaW5nUmVhZGVyIGlucHV0U3RyZWFtID0gbnVsbDsKKwlGaWxlV3JpdGVyIG91dHB1dFN0cmVhbSA9IG51bGw7CisJdHJ5IHsKKwkgICAgaW5wdXRTdHJlYW0gPSBuZXcgU3RyaW5nUmVhZGVyKGNvbnRlbnQpOworCSAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZVdyaXRlcihmaWxlKTsKKwkgICAgaW50IGM7CisJICAgIHdoaWxlICgoYyA9IGlucHV0U3RyZWFtLnJlYWQoKSkgIT0gLTEpIHsKKwkJb3V0cHV0U3RyZWFtLndyaXRlKGMpOworCSAgICB9CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCSAgICAvLyBUT0RPIGhhbmRsZSBiZXR0ZXIuCisJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorCQkgICAgIkNhbm5vdCBnZXQgcHJvcGVydGllcyBmaWxlIHRleHQuIEhhbmRsZSBiZXR0ZXIuIiwgZSk7CisJfSBmaW5hbGx5IHsKKwkgICAgY2xvc2VSZWFkZXIoaW5wdXRTdHJlYW0pOworCSAgICBjbG9zZVdyaXRlcihvdXRwdXRTdHJlYW0pOworCisJICAgIC8vIElGaWxlIGZpbGUgPQorCSAgICAvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbiggbmV3CisJICAgIC8vIFBhdGgoZ2V0UmVzb3VyY2VMb2NhdGlvbkxhYmVsKCkpKTsKKwkgICAgLy8gdHJ5IHsKKwkgICAgLy8gZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOworCSAgICAvLyB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkgICAgLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCSAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCSAgICAvLyB9CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLnJlc291cmNlCisgICAgICogICAgICAuSU1lc3NhZ2VzUmVzb3VyY2UjZ2V0U291cmNlKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpIHsKKwlyZXR1cm4gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBsb2NhdGlvbiBsYWJlbC4gb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VMb2NhdGlvbkxhYmVsKCkgeworCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgIH0KKworICAgIC8vIFRPRE8gbW92ZSB0byB1dGlsIGNsYXNzIGZvciBjb252aW5pZW5jZT8/PworICAgIHByaXZhdGUgdm9pZCBjbG9zZVdyaXRlcihXcml0ZXIgd3JpdGVyKSB7CisJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgIHRyeSB7CisJCXdyaXRlci5jbG9zZSgpOworCSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCS8vIFRPRE8gaGFuZGxlIGJldHRlci4KKwkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBjbG9zZSB3cml0ZXIgc3RyZWFtLiIsIGUpOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8vIFRPRE8gbW92ZSB0byB1dGlsIGNsYXNzIGZvciBjb252aW5pZW5jZT8/PworICAgIHB1YmxpYyB2b2lkIGNsb3NlUmVhZGVyKFJlYWRlciByZWFkZXIpIHsKKwlpZiAocmVhZGVyICE9IG51bGwpIHsKKwkgICAgdHJ5IHsKKwkJcmVhZGVyLmNsb3NlKCk7CisJICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJLy8gVE9ETyBoYW5kbGUgYmV0dGVyLgorCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNsb3NlIHJlYWRlci4iLCBlKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIHRoaXMgb2JqZWN0IHdpbGwgYmUgZGlzY2FyZGVkLiBOb3RoaW5nIHRvIGRvOiB3ZSB3ZXJlIG5vdAorICAgICAqIGxpc3RlbmluZyB0byBjaGFuZ2VzIHRvIHRoaXMgZmlsZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCUZpbGVNb25pdG9yLmdldEluc3RhbmNlKCkucmVtb3ZlRmlsZUNoYW5nZUxpc3RlbmVyKAorCQl0aGlzLmZpbGVDaGFuZ2VMaXN0ZW5lciwgZmlsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBGaWxlQ2hhbmdlTGlzdGVuZXJJbXBsIGltcGxlbWVudHMgRmlsZUNoYW5nZUxpc3RlbmVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGVDaGFuZ2VkKGZpbmFsIEZpbGUgY2hhbmdlZEZpbGUpIHsKKwkgICAgZmlyZVJlc291cmNlQ2hhbmdlKFByb3BlcnRpZXNGaWxlUmVzb3VyY2UudGhpcyk7CisJfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL1Byb3BlcnRpZXNJRmlsZVJlc291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2UvaW50ZXJuYWwvUHJvcGVydGllc0lGaWxlUmVzb3VyY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2UvUHJvcGVydGllc0lGaWxlUmVzb3VyY2UuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL2ludGVybmFsL1Byb3BlcnRpZXNJRmlsZVJlc291cmNlLmphdmEKaW5kZXggNTNjMDcwMy4uYWVjODVmZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL1Byb3BlcnRpZXNJRmlsZVJlc291cmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL2ludGVybmFsL1Byb3BlcnRpZXNJRmlsZVJlc291cmNlLmphdmEKQEAgLTgsNyArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMTYsMTEgKzE2LDEyIEBACiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLkFic3RyYWN0SUZpbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuQWJzdHJhY3RJRmlsZUNoYW5nZUxpc3RlbmVyLklGaWxlQ2hhbmdlTGlzdGVuZXJSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuQWJzdHJhY3RJRmlsZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5BYnN0cmFjdElGaWxlQ2hhbmdlTGlzdGVuZXIuSUZpbGVDaGFuZ2VMaXN0ZW5lclJlZ2lzdHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIuUHJvcGVydGllc0Rlc2VyaWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLlByb3BlcnRpZXNTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKQEAgLTg2LDExICs4NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLkFic3RyYWN0UHJvcGVydGllc1Jlc291cmNlCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwucmVzb3VyY2UuQWJzdHJhY3RQcm9wZXJ0aWVzUmVzb3VyY2UKICAgICAgKiAJCQkjZ2V0VGV4dCgpCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewogICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZmlsZS5nZXRDb250ZW50cygpOwogICAgICAgICAgICAgaW50IGJ5dGVDb3VudCA9IGlzLmF2YWlsYWJsZSgpOwogICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtieXRlQ291bnRdOwpAQCAtMTA1LDcgKzEwNyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuVGV4dFJlc291cmNlI3NldFRleHQoCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwucmVzb3VyY2UuVGV4dFJlc291cmNlI3NldFRleHQoCiAgICAgICogICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewpAQCAtMTE0LDYgKzExNiw3IEBACiAgICAgICAgIAlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKICAgICAgICAgCQkJdGV4dC5nZXRCeXRlcyhjaGFyc2V0KSk7CiAgICAgICAgICAgICBmaWxlLnNldENvbnRlbnRzKGlzLCBJRmlsZS5LRUVQX0hJU1RPUlksIG51bGwpOworICAgICAgICAgICAgZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy9UT0RPIGhhbmRsZSBiZXR0ZXIKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKApAQCAtMTIyLDcgKzEyNSw3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLklNZXNzYWdlc1Jlc291cmNlCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2UKICAgICAgKiAJCSNnZXRTb3VyY2UoKQogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0U291cmNlKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL1Byb3BlcnRpZXNSZWFkT25seVJlc291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2UvaW50ZXJuYWwvUHJvcGVydGllc1JlYWRPbmx5UmVzb3VyY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2UvUHJvcGVydGllc1JlYWRPbmx5UmVzb3VyY2UuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL2ludGVybmFsL1Byb3BlcnRpZXNSZWFkT25seVJlc291cmNlLmphdmEKaW5kZXggMTk5NzE4Mi4uYmVhYmYwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL1Byb3BlcnRpZXNSZWFkT25seVJlc291cmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL2ludGVybmFsL1Byb3BlcnRpZXNSZWFkT25seVJlc291cmNlLmphdmEKQEAgLTgsNyArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2U7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKQEAgLTUyLDcgKzUyLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLnJlc291cmNlLkFic3RyYWN0UHJvcGVydGllc1Jlc291cmNlCiAgICAgICogCQkJI2dldFRleHQoKQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgIC8qKgogICAgICAqIFVuc3VwcG9ydGVkIGhlcmUuIFRoaXMgaXMgcmVhZC1vbmx5LgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLlRleHRSZXNvdXJjZSNzZXRUZXh0KAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLnJlc291cmNlLlRleHRSZXNvdXJjZSNzZXRUZXh0KAogICAgICAqICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKQEAgLTcwLDcgKzcwLDcgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2UKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5yZXNvdXJjZS5JTWVzc2FnZXNSZXNvdXJjZQogICAgICAqIAkJI2dldFNvdXJjZSgpCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRTb3VyY2UoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2Uvc2VyL0lQcm9wZXJ0aWVzRGVzZXJpYWxpemVyQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2Uvc2VyL0lQcm9wZXJ0aWVzRGVzZXJpYWxpemVyQ29uZmlnLmphdmEKaW5kZXggOGU2M2EyMC4uZjIzMTUwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL3Nlci9JUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9zZXIvSVByb3BlcnRpZXNEZXNlcmlhbGl6ZXJDb25maWcuamF2YQpAQCAtMSw1ICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFsZXhlaiBTdHJlbHpvdy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBBbGV4ZWogU3RyZWx6b3cgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXI7CiAKKy8qKgorICogSW50ZXJmYWNlIGZvciB0aGUgZGVzZXJpYWxpemF0aW9uIHByb2Nlc3MuCisgKiAKKyAqIEBhdXRob3IgQWxleGVqIFN0cmVsem93CisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnRpZXNEZXNlcmlhbGl6ZXJDb25maWcgewogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2Uvc2VyL0lQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL3Nlci9JUHJvcGVydGllc1NlcmlhbGl6ZXJDb25maWcuamF2YQppbmRleCA1MGIzMDlmLi40NjllNmNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2Uvc2VyL0lQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9zZXIvSVByb3BlcnRpZXNTZXJpYWxpemVyQ29uZmlnLmphdmEKQEAgLTEsNSArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbGV4ZWogU3RyZWx6b3cuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgQWxleGVqIFN0cmVsem93IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyOwogCisvKioKKyAqIEludGVyZmFjZSBmb3IgdGhlIHNlcmlhbGl6YXRpb24gcHJvY2Vzcy4KKyAqIAorICogQGF1dGhvciBBbGV4ZWogU3RyZWx6b3cKKyAqLwogcHVibGljIGludGVyZmFjZSBJUHJvcGVydGllc1NlcmlhbGl6ZXJDb25maWcgewogCiAgICAgLyoqIE5ldyBMaW5lIFR5cGU6IERlZmF1bHQuICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2Uvc2VyL1Byb3BlcnRpZXNEZXNlcmlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9zZXIvUHJvcGVydGllc0Rlc2VyaWFsaXplci5qYXZhCmluZGV4IDA3ZWVhOTguLjJmZTQyNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9zZXIvUHJvcGVydGllc0Rlc2VyaWFsaXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9zZXIvUHJvcGVydGllc0Rlc2VyaWFsaXplci5qYXZhCkBAIC0xNiw4ICsxNiwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbC5CYWJlbFV0aWxzOwogCiAvKioKQEAgLTUyLDggKzU0LDkgQEAKICAgICAgKiBAcGFyYW0gbWVzc2FnZXNCdW5kbGUgdGhlIHRhcmdldCB7QGxpbmsgTWVzc2FnZXNCdW5kbGV9CiAgICAgICogQHBhcmFtIHByb3BlcnRpZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIHBhcnNlCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUsIFN0cmluZyBwcm9wZXJ0aWVzKSB7CisgICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoSU1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlLCBTdHJpbmcgcHJvcGVydGllcykgewogICAgICAgICBMb2NhbGUgbG9jYWxlID0gbWVzc2FnZXNCdW5kbGUuZ2V0TG9jYWxlKCk7CisgICAgICAgIAogICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gb2xkS2V5cyA9CiAgICAgICAgIAkJbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobWVzc2FnZXNCdW5kbGUuZ2V0S2V5cygpKSk7CiAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBuZXdLZXlzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CkBAIC0xMTQsNyArMTE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjb25maWcuaXNVbmljb2RlVW5lc2NhcGVFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcgIT0gbnVsbCAmJiBjb25maWcuaXNVbmljb2RlVW5lc2NhcGVFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAga2V5ID0gY29udmVydEVuY29kZWRUb1VuaWNvZGUoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0RW5jb2RlZFRvVW5pY29kZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEyMyw3ICsxMjYsNyBAQAogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcXFxuIiwgIlxuIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNZXNzYWdlIGVudHJ5ID0gbWVzc2FnZXNCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOworICAgICAgICAgICAgICAgIElNZXNzYWdlIGVudHJ5ID0gbWVzc2FnZXNCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOwogICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwogICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc0J1bmRsZS5hZGRNZXNzYWdlKGVudHJ5KTsKQEAgLTI0OSw0ICsyNTIsNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKICAgICB9CisgICAgCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2Uvc2VyL1Byb3BlcnRpZXNTZXJpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvcmVzb3VyY2Uvc2VyL1Byb3BlcnRpZXNTZXJpYWxpemVyLmphdmEKaW5kZXggMDRlNTNiMi4uNDIwYzRhZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3Jlc291cmNlL3Nlci9Qcm9wZXJ0aWVzU2VyaWFsaXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9yZXNvdXJjZS9zZXIvUHJvcGVydGllc1NlcmlhbGl6ZXIuamF2YQpAQCAtMTMsOCArMTMsOSBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlOwogCiAvKioKICAqIENsYXNzIHJlc3BvbnNpYmxlIGZvciBzZXJpYWxpemluZyBhIHtAbGluayBNZXNzYWdlc0J1bmRsZX0gaW50bwpAQCAtNzEsNyArNzIsNyBAQAogICAgICAqIEBwYXJhbSBtZXNzYWdlc0J1bmRsZSB0aGUgYnVuZGxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHN0cmluZwogICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBzdHJpbmcKICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZShNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgeworICAgIHB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKElNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgewogICAgICAgICBTdHJpbmcgbGluZUJyZWFrID0gU1lTVEVNX0xJTkVfU0VQOwogICAgICAgICBpbnQgbnVtT2ZMaW5lQnJlYWtzID0gY29uZmlnLmdldEdyb3VwU2VwQmxhbmtMaW5lQ291bnQoKTsKICAgICAgICAgU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CkBAIC05Niw3ICs5Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAJCQlTdHJpbmcga2V5ID0ga2V5c1tpXTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VzQnVuZGxlLmdldE1lc3NhZ2Uoa2V5KTsKKyAgICAgICAgICAgIElNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlc0J1bmRsZS5nZXRNZXNzYWdlKGtleSk7CiAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtZXNzYWdlLmdldFZhbHVlKCk7IAogICAgICAgICAgICAgU3RyaW5nIGNvbW1lbnQgPSBtZXNzYWdlLmdldENvbW1lbnQoKTsgICAgCiAgICAgICAgICAgICAKQEAgLTM1Niw3ICszNTcsNyBAQAogICAgICAqIEByZXR1cm4gcG9zaXRpb24KICAgICAgKi8KICAgICBwcml2YXRlIGludCBnZXRFcXVhbEluZGV4KAotICAgIAkJU3RyaW5nIGtleSwgU3RyaW5nIGdyb3VwLCBNZXNzYWdlc0J1bmRsZSBtZXNzYWdlc0J1bmRsZSkgeworICAgIAkJU3RyaW5nIGtleSwgU3RyaW5nIGdyb3VwLCBJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUpIHsKICAgICAgICAgaW50IGVxdWFsSW5kZXggPSAtMTsKICAgICAgICAgYm9vbGVhbiBhbGlnbkVxdWFscyA9IGNvbmZpZy5pc0FsaWduRXF1YWxzRW5hYmxlZCgpOwogICAgICAgICBib29sZWFuIGdyb3VwS2V5cyA9IGNvbmZpZy5pc0dyb3VwS2V5c0VuYWJsZWQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9zdHJhdGVneS9JTWVzc2FnZXNCdW5kbGVHcm91cFN0cmF0ZWd5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2Uvc3RyYXRlZ3kvSU1lc3NhZ2VzQnVuZGxlR3JvdXBTdHJhdGVneS5qYXZhCmluZGV4IDlhNTJhMzguLjU3ZGU3MzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9zdHJhdGVneS9JTWVzc2FnZXNCdW5kbGVHcm91cFN0cmF0ZWd5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3N0cmF0ZWd5L0lNZXNzYWdlc0J1bmRsZUdyb3VwU3RyYXRlZ3kuamF2YQpAQCAtNywxMyArNywxNCBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIEFsZXhlaiBTdHJlbHpvdyAtIFRhcEpJIGludGVncmF0aW9uLCBtZXNzYWdlc0J1bmRsZUlkCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2Uuc3RyYXRlZ3k7CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2U7CiAKIApAQCAtMzgsNiArMzksOCBAQAogICAgICAqLwogICAgIFN0cmluZyBjcmVhdGVNZXNzYWdlc0J1bmRsZUdyb3VwTmFtZSgpOwogICAgIAorICAgIFN0cmluZyBjcmVhdGVNZXNzYWdlc0J1bmRsZUlkKCk7CisgICAgCiAgICAgLyoqCiAgICAgICogTG9hZCBhbGwgYnVuZGxlcyBtYWtpbmcgdXAgYSBtZXNzYWdlcyBidW5kbGUgZ3JvdXAgZnJvbSB0aGUgdW5kZXJseWluZwogICAgICAqIHNvdXJjZS4KQEAgLTU3LDUgKzYwLDYgQEAKICAgICAgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24gcHJvYmxlbSBjcmVhdGluZyBhIG5ldyBtZXNzYWdlcyBidW5kbGUKICAgICAgKi8KICAgICBNZXNzYWdlc0J1bmRsZSBjcmVhdGVNZXNzYWdlc0J1bmRsZShMb2NhbGUgbG9jYWxlKSB0aHJvd3MgTWVzc2FnZUV4Y2VwdGlvbjsKLSAgICAgICAgCisgICAgCisgICAgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2Uvc3RyYXRlZ3kvUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2Uvc3RyYXRlZ3kvUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5LmphdmEKaW5kZXggN2Q3OTVhZi4uMDRmNjcyMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3N0cmF0ZWd5L1Byb3BlcnRpZXNGaWxlR3JvdXBTdHJhdGVneS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS9zdHJhdGVneS9Qcm9wZXJ0aWVzRmlsZUdyb3VwU3RyYXRlZ3kuamF2YQpAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBBbGV4ZWogU3RyZWx6b3cgLSBUYXBKSSBpbnRlZ3JhdGlvbiwgbWVzc2FnZXNCdW5kbGVJZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnN0cmF0ZWd5OwogCkBAIC0xNiwyOSArMTcsMzMgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5Qcm9wZXJ0aWVzRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuaW50ZXJuYWwuUHJvcGVydGllc0ZpbGVSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLklQcm9wZXJ0aWVzRGVzZXJpYWxpemVyQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIuSVByb3BlcnRpZXNTZXJpYWxpemVyQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIuUHJvcGVydGllc0Rlc2VyaWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLlByb3BlcnRpZXNTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbC5CYWJlbFV0aWxzOwotCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS51dGlsLk5hbWVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogCiAvKioKICAqIE1lc3NhZ2VzQnVuZGxlR3JvdXAgc3RyYXRlZ3kgZm9yIHN0YW5kYXJkIEphdmEgcHJvcGVydGllcyBmaWxlIHN0cnVjdHVyZS4KICAqIFRoYXQgaXMsIGFsbCAqLnByb3BlcnRpZXMgZmlsZXMgb2YgdGhlIHNhbWUgYmFzZSBuYW1lIHdpdGhpbiB0aGUgc2FtZQotICogZGlyZWN0b3J5LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB3b3JrcyBvbiBmaWxlcyBvdXRzaWRlIHRoZSBFY2xpcHNlCi0gKiB3b3Jrc3BhY2UuCisgKiBkaXJlY3RvcnkuIFRoaXMgaW1wbGVtZW50YXRpb24gd29ya3Mgb24gZmlsZXMgb3V0c2lkZSB0aGUgRWNsaXBzZSB3b3Jrc3BhY2UuCisgKiAKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZQogICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5IGltcGxlbWVudHMgSU1lc3NhZ2VzQnVuZGxlR3JvdXBTdHJhdGVneSB7CitwdWJsaWMgY2xhc3MgUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5IGltcGxlbWVudHMKKwlJTWVzc2FnZXNCdW5kbGVHcm91cFN0cmF0ZWd5IHsKIAogICAgIC8qKiBFbXB0eSBidW5kbGUgYXJyYXkuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZXNCdW5kbGVbXSBFTVBUWV9NRVNTQUdFUyA9Ci0gICAgCQluZXcgTWVzc2FnZXNCdW5kbGVbXSB7fTsKLSAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlc0J1bmRsZVtdIEVNUFRZX01FU1NBR0VTID0gbmV3IE1lc3NhZ2VzQnVuZGxlW10ge307CisKICAgICAvKiogRmlsZSBiZWluZyBvcGVuLCB0cmlnZ2VyaW5nIHRoZSBjcmVhdGlvbiBvZiBhIGJ1bmRsZSBncm91cC4gKi8KICAgICBwcml2YXRlIEZpbGUgZmlsZTsKICAgICAvKiogTWVzc2FnZXNCdW5kbGUgZ3JvdXAgYmFzZSBuYW1lLiAqLwpAQCAtNTEsMTAzICs1NiwxNTMgQEAKICAgICBwcml2YXRlIGZpbmFsIElQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZyBzZXJpYWxpemVyQ29uZmlnOwogICAgIC8qKiBQcm9wZXJ0aWVzIGZpbGUgZGVzZXJpYWxpemVyIGNvbmZpZ3VyYXRpb24uICovCiAgICAgcHJpdmF0ZSBmaW5hbCBJUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZyBkZXNlcmlhbGl6ZXJDb25maWc7Ci0gICAgCi0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gZmlsZSBmaWxlIGZyb20gd2hpY2ggdG8gZGVyaXZlIHRoZSBncm91cAorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlCisgICAgICogICAgICAgICAgICBmaWxlIGZyb20gd2hpY2ggdG8gZGVyaXZlIHRoZSBncm91cAogICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0aWVzRmlsZUdyb3VwU3RyYXRlZ3koCi0gICAgICAgICAgICBGaWxlIGZpbGUsCi0gICAgICAgICAgICBJUHJvcGVydGllc1NlcmlhbGl6ZXJDb25maWcgc2VyaWFsaXplckNvbmZpZywKLSAgICAgICAgICAgIElQcm9wZXJ0aWVzRGVzZXJpYWxpemVyQ29uZmlnIGRlc2VyaWFsaXplckNvbmZpZykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnNlcmlhbGl6ZXJDb25maWcgPSBzZXJpYWxpemVyQ29uZmlnOwotICAgICAgICB0aGlzLmRlc2VyaWFsaXplckNvbmZpZyA9IGRlc2VyaWFsaXplckNvbmZpZzsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgdGhpcy5maWxlRXh0ZW5zaW9uID0gZmlsZS5nZXROYW1lKCkucmVwbGFjZUZpcnN0KAotICAgICAgICAgICAgICAgICIoLipcXC4pKC4qKSIsICIkMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICBwdWJsaWMgUHJvcGVydGllc0ZpbGVHcm91cFN0cmF0ZWd5KEZpbGUgZmlsZSwKKwkgICAgSVByb3BlcnRpZXNTZXJpYWxpemVyQ29uZmlnIHNlcmlhbGl6ZXJDb25maWcsCisJICAgIElQcm9wZXJ0aWVzRGVzZXJpYWxpemVyQ29uZmlnIGRlc2VyaWFsaXplckNvbmZpZykgeworCXN1cGVyKCk7CisJdGhpcy5zZXJpYWxpemVyQ29uZmlnID0gc2VyaWFsaXplckNvbmZpZzsKKwl0aGlzLmRlc2VyaWFsaXplckNvbmZpZyA9IGRlc2VyaWFsaXplckNvbmZpZzsKKwl0aGlzLmZpbGUgPSBmaWxlOworCXRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGUuZ2V0TmFtZSgpLnJlcGxhY2VGaXJzdCgiKC4qXFwuKSguKikiLCAiJDIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKLSAgICAgICAgU3RyaW5nIHBhdHRlcm5Db3JlID0KLSAgICAgICAgICAgICAgICAiKChfW2Etel17MiwzfSl8KF9bYS16XXsyLDN9X1tBLVpdezJ9KSIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICArICJ8KF9bYS16XXsyLDN9X1tBLVpdezJ9X1xcdyopKT8oXFwuIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICsgZmlsZUV4dGVuc2lvbiArICIpJCI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgcGF0dGVybkNvcmUgPSAiKChfW2Etel17MiwzfSl8KF9bYS16XXsyLDN9X1tBLVpdezJ9KSIgLy8kTk9OLU5MUy0xJAorCQkrICJ8KF9bYS16XXsyLDN9X1tBLVpdezJ9X1xcdyopKT8oXFwuIiAvLyROT04tTkxTLTEkCisJCSsgZmlsZUV4dGVuc2lvbiArICIpJCI7IC8vJE5PTi1OTFMtMSQKIAotICAgICAgICAvLyBDb21wdXRlIGFuZCBjYWNoZSBuYW1lCi0gICAgICAgIFN0cmluZyBuYW1lUGF0dGVybiA9ICJeKC4qPykiICsgcGF0dGVybkNvcmU7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5iYXNlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpLnJlcGxhY2VGaXJzdCgKLSAgICAgICAgICAgICAgICBuYW1lUGF0dGVybiwgIiQxIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIC8vIEZpbGUgbWF0Y2hpbmcgcGF0dGVybgotICAgICAgICB0aGlzLmZpbGVNYXRjaFBhdHRlcm4gPQotICAgICAgICAgICAgICAgICJeKCIgKyBiYXNlTmFtZSArICIpIiArIHBhdHRlcm5Db3JlOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkvLyBDb21wdXRlIGFuZCBjYWNoZSBuYW1lCisJU3RyaW5nIG5hbWVQYXR0ZXJuID0gIl4oLio/KSIgKyBwYXR0ZXJuQ29yZTsgLy8kTk9OLU5MUy0xJAorCXRoaXMuYmFzZU5hbWUgPSBmaWxlLmdldE5hbWUoKS5yZXBsYWNlRmlyc3QobmFtZVBhdHRlcm4sICIkMSIpOyAvLyROT04tTkxTLTEkCisKKwkvLyBGaWxlIG1hdGNoaW5nIHBhdHRlcm4KKwl0aGlzLmZpbGVNYXRjaFBhdHRlcm4gPSAiXigiICsgYmFzZU5hbWUgKyAiKSIgKyBwYXR0ZXJuQ29yZTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuYnVuZGxlLklNZXNzYWdlc0J1bmRsZUdyb3VwU3RyYXRlZ3kKLSAgICAgKiAJCQkjZ2V0TWVzc2FnZXNCdW5kbGVHcm91cE5hbWUoKQorICAgICAqICAgICAgI2dldE1lc3NhZ2VzQnVuZGxlR3JvdXBOYW1lKCkKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU1lc3NhZ2VzQnVuZGxlR3JvdXBOYW1lKCkgewotICAgICAgICByZXR1cm4gYmFzZU5hbWUgKyAiWy4uLl0uIiArIGZpbGVFeHRlbnNpb247IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYmFzZU5hbWUgKyAiWy4uLl0uIiArIGZpbGVFeHRlbnNpb247IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuYnVuZGxlLklNZXNzYWdlc0J1bmRsZUdyb3VwU3RyYXRlZ3kKLSAgICAgKiAgICAgICAgICAjbG9hZE1lc3NhZ2VzQnVuZGxlcygpCisgICAgICogICAgICAjbG9hZE1lc3NhZ2VzQnVuZGxlcygpCiAgICAgICovCiAgICAgcHVibGljIE1lc3NhZ2VzQnVuZGxlW10gbG9hZE1lc3NhZ2VzQnVuZGxlcygpIHRocm93cyBNZXNzYWdlRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVtdIHJlc291cmNlcyA9IG51bGw7Ci0gICAgICAgIEZpbGUgcGFyZW50RGlyID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgIGlmIChwYXJlbnREaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzb3VyY2VzID0gcGFyZW50RGlyLmxpc3RGaWxlcygpOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb248TWVzc2FnZXNCdW5kbGU+IGJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VzQnVuZGxlPigpOwotICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5pc0ZpbGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzb3VyY2VOYW1lLm1hdGNoZXMoZmlsZU1hdGNoUGF0dGVybikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgbG9jYWwgdGl0bGUKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsZVRleHQgPSByZXNvdXJjZU5hbWUucmVwbGFjZUZpcnN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNYXRjaFBhdHRlcm4sICIkMiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBCYWJlbFV0aWxzLnBhcnNlTG9jYWxlKGxvY2FsZVRleHQpOwotICAgICAgICAgICAgICAgICAgICBidW5kbGVzLmFkZChjcmVhdGVCdW5kbGUobG9jYWxlLCByZXNvdXJjZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVuZGxlcy50b0FycmF5KEVNUFRZX01FU1NBR0VTKTsKKwlGaWxlW10gcmVzb3VyY2VzID0gbnVsbDsKKwlGaWxlIHBhcmVudERpciA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworCWlmIChwYXJlbnREaXIgIT0gbnVsbCkgeworCSAgICByZXNvdXJjZXMgPSBwYXJlbnREaXIubGlzdEZpbGVzKCk7CisJfQorCUNvbGxlY3Rpb248TWVzc2FnZXNCdW5kbGU+IGJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VzQnVuZGxlPigpOworCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworCQlGaWxlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOworCQlpZiAocmVzb3VyY2UuaXNGaWxlKCkgJiYgcmVzb3VyY2VOYW1lLm1hdGNoZXMoZmlsZU1hdGNoUGF0dGVybikpIHsKKwkJICAgIC8vIEJ1aWxkIGxvY2FsIHRpdGxlCisJCSAgICBTdHJpbmcgbG9jYWxlVGV4dCA9IHJlc291cmNlTmFtZS5yZXBsYWNlRmlyc3QoCisJCQkgICAgZmlsZU1hdGNoUGF0dGVybiwgIiQyIik7IC8vJE5PTi1OTFMtMSQKKwkJICAgIExvY2FsZSBsb2NhbGUgPSBCYWJlbFV0aWxzLnBhcnNlTG9jYWxlKGxvY2FsZVRleHQpOworCQkgICAgYnVuZGxlcy5hZGQoY3JlYXRlQnVuZGxlKGxvY2FsZSwgcmVzb3VyY2UpKTsKKwkJfQorCSAgICB9CisJfQorCXJldHVybiBidW5kbGVzLnRvQXJyYXkoRU1QVFlfTUVTU0FHRVMpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5idW5kbGUuSUJ1bmRsZUdyb3VwU3RyYXRlZ3kKLSAgICAgKiAgICAgICAgICAjY3JlYXRlQnVuZGxlKGphdmEudXRpbC5Mb2NhbGUpCisgICAgICogICAgICAjY3JlYXRlQnVuZGxlKGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCiAgICAgcHVibGljIE1lc3NhZ2VzQnVuZGxlIGNyZWF0ZU1lc3NhZ2VzQnVuZGxlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgbWUgKGNvZGUgZXhpc3RzIGluIFNvdXJjZUZvcmdlIHZlcnNpb24pCi0gICAgICAgIHJldHVybiBudWxsOworCS8vIFRPRE8gSW1wbGVtZW50IG1lIChjb2RlIGV4aXN0cyBpbiBTb3VyY2VGb3JnZSB2ZXJzaW9uKQorCXJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSByZXNvdXJjZSBidW5kbGUgZm9yIGFuIGV4aXN0aW5nIHJlc291cmNlLgotICAgICAqIEBwYXJhbSBsb2NhbGUgbG9jYWxlIGZvciB3aGljaCB0byBjcmVhdGUgYSBidW5kbGUKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgdXNlZCB0byBjcmVhdGUgYnVuZGxlCisgICAgICogCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgbG9jYWxlIGZvciB3aGljaCB0byBjcmVhdGUgYSBidW5kbGUKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHJlc291cmNlIHVzZWQgdG8gY3JlYXRlIGJ1bmRsZQogICAgICAqIEByZXR1cm4gYW4gaW5pdGlhbGl6ZWQgYnVuZGxlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE1lc3NhZ2VzQnVuZGxlIGNyZWF0ZUJ1bmRsZShMb2NhbGUgbG9jYWxlLCBGaWxlIHJlc291cmNlKQotICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9UT0RPIGhhdmUgdGhlIHRleHQgZGUvc2VyaWFsaXplciB0aWVkIHRvIEVjbGlwc2UgcHJlZmVyZW5jZXMsCi0gICAgICAgICAgICAvL3NpbmdsZXRvbiBwZXIgcHJvamVjdCwgYW5kIGxpc3RlbmluZyBmb3IgY2hhbmdlcwotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlc0J1bmRsZShuZXcgUHJvcGVydGllc0ZpbGVSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIoc2VyaWFsaXplckNvbmZpZyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0aWVzRGVzZXJpYWxpemVyKGRlc2VyaWFsaXplckNvbmZpZyksCi0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYnVuZGxlIGZvciBsb2NhbGUgIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICArIGxvY2FsZSArICIgYW5kIHJlc291cmNlICIgKyByZXNvdXJjZSwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQorCSAgICB0aHJvd3MgTWVzc2FnZUV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkgICAgLy8gVE9ETyBoYXZlIHRoZSB0ZXh0IGRlL3NlcmlhbGl6ZXIgdGllZCB0byBFY2xpcHNlIHByZWZlcmVuY2VzLAorCSAgICAvLyBzaW5nbGV0b24gcGVyIHByb2plY3QsIGFuZCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMKKwkgICAgcmV0dXJuIG5ldyBNZXNzYWdlc0J1bmRsZShuZXcgUHJvcGVydGllc0ZpbGVSZXNvdXJjZShsb2NhbGUsCisJCSAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIoc2VyaWFsaXplckNvbmZpZyksCisJCSAgICBuZXcgUHJvcGVydGllc0Rlc2VyaWFsaXplcihkZXNlcmlhbGl6ZXJDb25maWcpLCByZXNvdXJjZSkpOworCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGJ1bmRsZSBmb3IgbG9jYWxlICIgLy8kTk9OLU5MUy0xJAorCQkgICAgKyBsb2NhbGUgKyAiIGFuZCByZXNvdXJjZSAiICsgcmVzb3VyY2UsIGUpOyAvLyROT04tTkxTLTEkCisJfQogICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTWVzc2FnZXNCdW5kbGVJZCgpIHsKKwlTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisJaW50IGluZGV4ID0gcGF0aC5pbmRleE9mKCJzcmMiKTsKKwlTdHJpbmcgcGF0aEJlZm9yZVNyYyA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4IC0gMSk7CisJaW50IGxhc3RJbmRleE9mID0gcGF0aEJlZm9yZVNyYy5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOworCVN0cmluZyBwcm9qZWN0TmFtZSA9IHBhdGguc3Vic3RyaW5nKGxhc3RJbmRleE9mICsgMSwgaW5kZXggLSAxKTsKKwlTdHJpbmcgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGguc3Vic3RyaW5nKGluZGV4LCBwYXRoLmxlbmd0aCgpKTsKKworCUlGaWxlIGYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCisJCS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKS5nZXRGaWxlKHJlbGF0aXZlRmlsZVBhdGgpOworCisJcmV0dXJuIE5hbWVVdGlscy5nZXRSZXNvdXJjZUJ1bmRsZUlkKGYpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7CisJSVBhdGggcGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKKwlJUGF0aCBmdWxsUGF0aCA9IG51bGw7CisJaWYgKHRoaXMuZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5jb250YWlucyhwYXRoLnRvT1NTdHJpbmcoKSkpIHsKKwkgICAgZnVsbFBhdGggPSBuZXcgUGF0aCh0aGlzLmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCX0gZWxzZSB7CisJICAgIGZ1bGxQYXRoID0gbmV3IFBhdGgocGF0aC50b09TU3RyaW5nKCkgKyB0aGlzLmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCX0KKworCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCisJCS5nZXRGaWxlRm9yTG9jYXRpb24oZnVsbFBhdGgpOworCisJaWYgKGZpbGUgIT0gbnVsbCkgeworCSAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQorCQkgICAgLmdldFByb2plY3QoZmlsZS5nZXRGdWxsUGF0aCgpLnNlZ21lbnRzKClbMF0pLmdldE5hbWUoKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gbnVsbDsKKwl9CisJCisgICAgfQorCisgICAgLy8gcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVJZCAoSVJlc291cmNlIHJlc291cmNlKSB7CisgICAgLy8gU3RyaW5nIHBhY2thZ2VGcmFnbWVudCA9ICIiOworICAgIC8vCisgICAgLy8gSUphdmFFbGVtZW50IHByb3BlcnR5RmlsZSA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQYXJlbnQoKSk7CisgICAgLy8gaWYgKHByb3BlcnR5RmlsZSAhPSBudWxsICYmIHByb3BlcnR5RmlsZSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpCisgICAgLy8gcGFja2FnZUZyYWdtZW50ID0gKChJUGFja2FnZUZyYWdtZW50KSBwcm9wZXJ0eUZpbGUpLmdldEVsZW1lbnROYW1lKCk7CisgICAgLy8KKyAgICAvLyByZXR1cm4gKHBhY2thZ2VGcmFnbWVudC5sZW5ndGgoKSA+IDAgPyBwYWNrYWdlRnJhZ21lbnQgKyAiLiIgOiAiIikgKworICAgIC8vIGdldFJlc291cmNlQnVuZGxlTmFtZShyZXNvdXJjZSk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKElSZXNvdXJjZSByZXMpIHsKKyAgICAvLyBTdHJpbmcgbmFtZSA9IHJlcy5nZXROYW1lKCk7CisgICAgLy8gICAgCVN0cmluZyByZWdleCA9ICJeKC4qPykiIC8vJE5PTi1OTFMtMSQKKyAgICAvLyAgICAgICAgICAgICAgICArICIoKF9bYS16XXsyLDN9KXwoX1thLXpdezIsM31fW0EtWl17Mn0pIiAvLyROT04tTkxTLTEkCisgICAgLy8gICAgICAgICAgICAgICAgKyAifChfW2Etel17MiwzfV9bQS1aXXsyfV9cXHcqKSk/KFxcLiIgLy8kTk9OLU5MUy0xJAorICAgIC8vICAgICAgICAgICAgICAgICsgcmVzLmdldEZpbGVFeHRlbnNpb24oKSArICIpJCI7IC8vJE5PTi1OTFMtMSQKKyAgICAvLyAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZUZpcnN0KHJlZ2V4LCAiJDEiKTsgLy8kTk9OLU5MUy0xJAorICAgIC8vIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL0lBYnN0cmFjdEtleVRyZWVNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvSUFic3RyYWN0S2V5VHJlZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyMTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL0lBYnN0cmFjdEtleVRyZWVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFJlaXRlcmVyLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1hcnRpbiBSZWl0ZXJlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWU7CisKKworcHVibGljIGludGVyZmFjZSBJQWJzdHJhY3RLZXlUcmVlTW9kZWwgeworCisJSUtleVRyZWVOb2RlW10gZ2V0Q2hpbGRyZW4oSUtleVRyZWVOb2RlIG5vZGUpOworCisJSUtleVRyZWVOb2RlIGdldENoaWxkKFN0cmluZyBrZXkpOworCisJSUtleVRyZWVOb2RlW10gZ2V0Um9vdE5vZGVzKCk7CisKKwlJS2V5VHJlZU5vZGUgZ2V0Um9vdE5vZGUoKTsKKworCUlLZXlUcmVlTm9kZSBnZXRQYXJlbnQoSUtleVRyZWVOb2RlIG5vZGUpOworCisJdm9pZCBhY2NlcHQoSUtleVRyZWVWaXNpdG9yIHZpc2l0b3IsIElLZXlUcmVlTm9kZSBub2RlKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvSUtleVRyZWVOb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9JS2V5VHJlZU5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2I4NTg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvSUtleVRyZWVOb2RlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYXJ0aW4gUmVpdGVyZXIuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWFydGluIFJlaXRlcmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGVHcm91cDsKKworcHVibGljIGludGVyZmFjZSBJS2V5VHJlZU5vZGUgeworCisJLyoqCisJICogUmV0dXJucyB0aGUga2V5IG9mIHRoZSBjb3JyZXNwb25kaW5nIFJlc291cmNlLUJ1bmRsZSBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIFRoZSBrZXkgb2YgdGhlIFJlc291cmNlLUJ1bmRsZSBlbnRyeQorCSAqLworCVN0cmluZyBnZXRNZXNzYWdlS2V5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgUmVzb3VyY2UtQnVuZGxlIGVudHJpZXMgb2YgdGhlIG5leHQgZGVlcGVyIGhpZXJhcmNoeQorCSAqIGxldmVsIHRoYXQgc2hhcmUgdGhlIHJlcHJlc2VudGVkIGVudHJ5IGFzIHRoZWlyIGNvbW1vbiBwYXJlbnQuCisJICogCisJICogQHJldHVybiBUaGUgZGlyZWN0IGNoaWxkIFJlc291cmNlLUJ1bmRsZSBlbnRyaWVzCisJICovCisJSUtleVRyZWVOb2RlW10gZ2V0Q2hpbGRyZW4oKTsKKworCS8qKgorCSAqIFRoZSByZXByZXNlbnRlZCBSZXNvdXJjZS1CdW5kbGUgZW50cnkncyBpZCB3aXRob3V0IHRoZSBwcmVmaXggZGVmaW5lZCBieQorCSAqIHRoZSBlbnRyeSdzIHBhcmVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIFRoZSBSZXNvdXJjZS1CdW5kbGUgZW50cnkncyBkaXNwbGF5IG5hbWUuCisJICovCisJU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNldCBvZiBSZXNvdXJjZS1CdW5kbGUgZW50cmllcyBmcm9tIGFsbCBkZWVwZXIgaGllcmFyY2h5CisJICogbGV2ZWxzIHRoYXQgc2hhcmUgdGhlIHJlcHJlc2VudGVkIGVudHJ5IGFzIHRoZWlyIGNvbW1vbiBwYXJlbnQuCisJICogCisJICogQHJldHVybiBBbGwgY2hpbGQgUmVzb3VyY2UtQnVuZGxlIGVudHJpZXMKKwkgKi8KKwkvLyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJS2V5VHJlZUl0ZW0+IGdldE5lc3RlZENoaWxkcmVuKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBSZXNvdXJjZS1CdW5kbGUgZW50cnkgaXMgdmlzaWJsZSB1bmRlciB0aGUgZ2l2ZW4KKwkgKiBmaWx0ZXIgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZmlsdGVyCisJICogICAgICAgICAgICBUaGUgZmlsdGVyIGV4cHJlc3Npb24KKwkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbHRlciBleHByZXNzaW9uIG1hdGNoZXMgdGhlIHJlcHJlc2VudGVkCisJICogICAgICAgICBSZXNvdXJjZS1CdW5kbGUgZW50cnkKKwkgKi8KKwkvLyBib29sZWFuIGFwcGx5RmlsdGVyKFN0cmluZyBmaWx0ZXIpOworCisJLyoqCisJICogVGhlIFJlc291cmNlLUJ1bmRsZSBlbnRyaWVzIHBhcmVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQgUmVzb3VyY2UtQnVuZGxlIGVudHJ5CisJICovCisJSUtleVRyZWVOb2RlIGdldFBhcmVudCgpOworCisJLyoqCisJICogVGhlIFJlc291cmNlLUJ1bmRsZXMga2V5IHJlcHJlc2VudGF0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gVGhlIFJlc291cmNlLUJ1bmRsZSByZWZlcmVuY2UsIGlmIGtub3duCisJICovCisJSU1lc3NhZ2VzQnVuZGxlR3JvdXAgZ2V0TWVzc2FnZXNCdW5kbGVHcm91cCgpOworCisJYm9vbGVhbiBpc1VzZWRBc0tleSgpOworCisJdm9pZCBzZXRQYXJlbnQoSUtleVRyZWVOb2RlIHBhcmVudE5vZGUpOworCisJdm9pZCBhZGRDaGlsZChJS2V5VHJlZU5vZGUgY2hpbGROb2RlKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvdmlzaXRvci9JS2V5VHJlZVZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL0lLZXlUcmVlVmlzaXRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL3Zpc2l0b3IvSUtleVRyZWVWaXNpdG9yLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL0lLZXlUcmVlVmlzaXRvci5qYXZhCmluZGV4IDBmNGZmNWYuLmFjN2E1MzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL3Zpc2l0b3IvSUtleVRyZWVWaXNpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvSUtleVRyZWVWaXNpdG9yLmphdmEKQEAgLTgsMTkgKzgsMjEgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLnZpc2l0b3I7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuS2V5VHJlZU5vZGU7CiAKIC8qKgogICogT2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIGFjdCBhcyBhIHZpc2l0b3IgdG8gYQogICogPGNvZGU+SUtleVRyZWVNb2RlbDwvY29kZT4uCisgKiAKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZSAocGFzY2FsQGVzc2llbWJyZS5jb20pCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUtleVRyZWVWaXNpdG9yIHsKLSAgICAvKioKLSAgICAgKiBWaXNpdHMgYSBrZXkgdHJlZSBub2RlLgotICAgICAqIEBwYXJhbSBpdGVtIGtleSB0cmVlIG5vZGUgdG8gdmlzaXQKLSAgICAgKi8KLQl2b2lkIHZpc2l0S2V5VHJlZU5vZGUoS2V5VHJlZU5vZGUgbm9kZSk7CisJLyoqCisJICogVmlzaXRzIGEga2V5IHRyZWUgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlbQorCSAqICAgICAgICAgICAga2V5IHRyZWUgbm9kZSB0byB2aXNpdAorCSAqLworCXZvaWQgdmlzaXRLZXlUcmVlTm9kZShJS2V5VHJlZU5vZGUgbm9kZSk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9UcmVlVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvVHJlZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjgzM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvVHJlZVR5cGUuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFsZXhlaiBTdHJlbHpvdy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBBbGV4ZWogU3RyZWx6b3cgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlOworCisvKioKKyAqIEVudW0gZm9yIHR3byB0cmVlIHR5cGVzLiBJZiBhIHRyZWUgaGFzIHRoZSB0eXBlIHtAbGluayAjVHJlZX0sIHRoZW4gaXQKKyAqIGlzIGRpc3BsYXllZCBhcyB0cmVlLiBFLmcuIGZvbGxvd2luZyBrZXkgaXMgZ2l2ZW46IHBhcmVudC5jaGlsZC5ncmFuZGNoaWxkCisgKiByZXN1bHQ6IAorICogPHByZT4KKyAqIHBhcmVudAorICogCWNoaWxkCisgKiAJCWdyYW5kY2hpbGQKKyAqIDwvcHJlPgorICogSWYgaXQgaXMge0BsaW5rICNGbGF0fSwgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgcGFyZW50LmNoaWxkLmdyYW5kY2hpbGQuCisgKiAKKyAqIEBhdXRob3IgQWxleGVqIFN0cmVsem93CisgKi8KK3B1YmxpYyBlbnVtIFRyZWVUeXBlIHsKKwlUcmVlLCBGbGF0Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9BYnN0cmFjdEtleVRyZWVNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvaW50ZXJuYWwvQWJzdHJhY3RLZXlUcmVlTW9kZWwuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9BYnN0cmFjdEtleVRyZWVNb2RlbC5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9pbnRlcm5hbC9BYnN0cmFjdEtleVRyZWVNb2RlbC5qYXZhCmluZGV4IGQ4OGRkYzYuLjc0YmUwOWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL0Fic3RyYWN0S2V5VHJlZU1vZGVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvaW50ZXJuYWwvQWJzdHJhY3RLZXlUcmVlTW9kZWwuamF2YQpAQCAtNyw4ICs3LDkgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBNYXR0aGlhcyBMZXR0bWF5ZXIgLSBmaXhlZCBidWcgaW4gcmV0dXJuTm9kZVdpdGhLZXkoKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWU7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMTYsOSArMTcsMTEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXBBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLnZpc2l0b3IuSUtleVRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZUdyb3VwQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JQWJzdHJhY3RLZXlUcmVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuSUtleVRyZWVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLklLZXlUcmVlVmlzaXRvcjsKIAogCiAvKioKQEAgLTM3LDEyICs0MCwxMiBAQAogICogCiAgKiBAYXV0aG9yIFBhc2NhbCBFc3NpZW1icmUKICAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0S2V5VHJlZU1vZGVsIHsKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdEtleVRyZWVNb2RlbCBpbXBsZW1lbnRzIElBYnN0cmFjdEtleVRyZWVNb2RlbCB7CiAKICAgICBwcml2YXRlIExpc3Q8SUtleVRyZWVNb2RlbExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElLZXlUcmVlTW9kZWxMaXN0ZW5lcj4oKTsKLSAgICBwcml2YXRlIENvbXBhcmF0b3I8S2V5VHJlZU5vZGU+IGNvbXBhcmF0b3I7CisgICAgcHJpdmF0ZSBDb21wYXJhdG9yPElLZXlUcmVlTm9kZT4gY29tcGFyYXRvcjsKICAgICAKLSAgICBwcml2YXRlIEtleVRyZWVOb2RlIHJvb3ROb2RlID0gbmV3IEtleVRyZWVOb2RlKG51bGwsIG51bGwsIG51bGwpOworICAgIHByaXZhdGUgS2V5VHJlZU5vZGUgcm9vdE5vZGUgPSBuZXcgS2V5VHJlZU5vZGUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgCiAgICAgcHJpdmF0ZSBTdHJpbmcgZGVsaW1pdGVyOwogICAgIHByaXZhdGUgTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwOwpAQCAtMTMzLDExICsxMzYsMTUgQEAKICAgICAgKiBAcGFyYW0gdmlzaXRvciB0aGUgb2JqZWN0IHRvIHZpc2l0CiAgICAgICogQHBhcmFtIG5vZGUgdGhlIHN0YXJ0aW5nIGtleSB0cmVlIG5vZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHQoSUtleVRyZWVWaXNpdG9yIHZpc2l0b3IsIEtleVRyZWVOb2RlIG5vZGUpIHsKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoSUtleVRyZWVWaXNpdG9yIHZpc2l0b3IsIElLZXlUcmVlTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgdmlzaXRvci52aXNpdEtleVRyZWVOb2RlKG5vZGUpOwogICAgICAgICB9Ci0gICAgICAgIEtleVRyZWVOb2RlW10gbm9kZXMgPSBnZXRDaGlsZHJlbihub2RlKTsKKyAgICAgICAgSUtleVRyZWVOb2RlW10gbm9kZXMgPSBnZXRDaGlsZHJlbihub2RlKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgYWNjZXB0KHZpc2l0b3IsIG5vZGVzW2ldKTsKICAgICAgICAgfQpAQCAtMTQ4LDggKzE1NSwxMiBAQAogICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGZyb20gd2hpY2ggdG8gZ2V0IGNoaWxkcmVuCiAgICAgICogQHJldHVybiBjaGlsZCBub2RlcwogICAgICAqLwotICAgIHB1YmxpYyBLZXlUcmVlTm9kZVtdIGdldENoaWxkcmVuKEtleVRyZWVOb2RlIG5vZGUpIHsKLSAgICAgICAgS2V5VHJlZU5vZGVbXSBub2RlcyA9IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKKyAgICBwdWJsaWMgSUtleVRyZWVOb2RlW10gZ2V0Q2hpbGRyZW4oSUtleVRyZWVOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIElLZXlUcmVlTm9kZVtdIG5vZGVzID0gbm9kZS5nZXRDaGlsZHJlbigpOwogICAgICAgICBpZiAoZ2V0Q29tcGFyYXRvcigpICE9IG51bGwpIHsKICAgICAgICAgICAgIEFycmF5cy5zb3J0KG5vZGVzLCBnZXRDb21wYXJhdG9yKCkpOwogICAgICAgICB9CkBAIC0xNjAsNyArMTcxLDcgQEAKICAgICAgKiBHZXRzIHRoZSBjb21wYXJhdG9yLgogICAgICAqIEByZXR1cm4gdGhlIGNvbXBhcmF0b3IKICAgICAgKi8KLSAgICBwdWJsaWMgQ29tcGFyYXRvcjxLZXlUcmVlTm9kZT4gZ2V0Q29tcGFyYXRvcigpIHsKKyAgICBwdWJsaWMgQ29tcGFyYXRvcjxJS2V5VHJlZU5vZGU+IGdldENvbXBhcmF0b3IoKSB7CiAgICAgICAgIHJldHVybiBjb21wYXJhdG9yOwogICAgIH0KIApAQCAtMTY4LDcgKzE3OSw3IEBACiAgICAgICogU2V0cyB0aGUgbm9kZSBjb21wYXJhdG9yIGZvciBzb3J0aW5nIHNpYmxpbmcgbm9kZXMuCiAgICAgICogQHBhcmFtIGNvbXBhcmF0b3Igbm9kZSBjb21wYXJhdG9yCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yPEtleVRyZWVOb2RlPiBjb21wYXJhdG9yKSB7CisgICAgcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yPElLZXlUcmVlTm9kZT4gY29tcGFyYXRvcikgewogICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwogICAgIH0KICAgICAKQEAgLTE4MCwxMiArMTkxLDEyIEBACiAgICAgICogQHBhcmFtIG5vZGUKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIG9yIG9uZSBvZiBpdHMgZGVzY2VuZGFudCBpcyBpbiB0aGUgZmlsdGVyIChpZSBpcyBkaXNwbGF5ZWQpCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNCcmFuY2hGaWx0ZXJlZChJS2V5VHJlZU5vZGVMZWFmRmlsdGVyIGZpbHRlciwgS2V5VHJlZU5vZGUgbm9kZSkgewotICAgIAlpZiAoIW5vZGUuaGFzQ2hpbGRyZW4oKSkgeworICAgIHB1YmxpYyBib29sZWFuIGlzQnJhbmNoRmlsdGVyZWQoSUtleVRyZWVOb2RlTGVhZkZpbHRlciBmaWx0ZXIsIElLZXlUcmVlTm9kZSBub2RlKSB7CisgICAgCWlmICghKChLZXlUcmVlTm9kZSlub2RlKS5oYXNDaGlsZHJlbigpKSB7CiAgICAgCQlyZXR1cm4gZmlsdGVyLmlzRmlsdGVyZWRMZWFmKG5vZGUpOwogICAgIAl9IGVsc2UgewogICAgIAkJLy9kZXB0aCBmaXJzdDoKLSAgICAJCWZvciAoS2V5VHJlZU5vZGUgY2hpbGROb2RlIDogbm9kZS5nZXRDaGlsZHJlbkludGVybmFsKCkpIHsKKyAgICAJCWZvciAoSUtleVRyZWVOb2RlIGNoaWxkTm9kZSA6ICgoS2V5VHJlZU5vZGUpbm9kZSkuZ2V0Q2hpbGRyZW5JbnRlcm5hbCgpKSB7CiAgICAgCQkJaWYgKGlzQnJhbmNoRmlsdGVyZWQoZmlsdGVyLCBjaGlsZE5vZGUpKSB7CiAgICAgCQkJCXJldHVybiB0cnVlOwogICAgIAkJCX0KQEAgLTIxMywxMSArMjI0LDExIEBACiAJICogR2V0cyB0aGUga2V5IHRyZWUgcm9vdCBub2Rlcy4KIAkgKiBAcmV0dXJuIGtleSB0cmVlIHJvb3Qgbm9kZXMKIAkgKi8KLSAgICBwdWJsaWMgS2V5VHJlZU5vZGVbXSBnZXRSb290Tm9kZXMoKSB7CisgICAgcHVibGljIElLZXlUcmVlTm9kZVtdIGdldFJvb3ROb2RlcygpIHsKICAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKHJvb3ROb2RlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgS2V5VHJlZU5vZGUgZ2V0Um9vdE5vZGUoKSB7CisgICAgcHVibGljIElLZXlUcmVlTm9kZSBnZXRSb290Tm9kZSgpIHsKICAgICAJcmV0dXJuIHJvb3ROb2RlOwogICAgIH0KICAgICAKQEAgLTIyNiw3ICsyMzcsNyBAQAogICAgICAqIEBwYXJhbSBub2RlIG5vZGUgZnJvbSB3aGljaCB0byBnZXQgcGFyZW50CiAgICAgICogQHJldHVybiBwYXJlbnQgbm9kZQogICAgICAqLwotICAgIHB1YmxpYyBLZXlUcmVlTm9kZSBnZXRQYXJlbnQoS2V5VHJlZU5vZGUgbm9kZSkgeworICAgIHB1YmxpYyBJS2V5VHJlZU5vZGUgZ2V0UGFyZW50KElLZXlUcmVlTm9kZSBub2RlKSB7CiAgICAgICAgIHJldHVybiBub2RlLmdldFBhcmVudCgpOwogICAgIH0KICAgICAKQEAgLTI0MCw3ICsyNTEsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUcmVlKCkgewotICAgICAgICByb290Tm9kZSA9IG5ldyBLZXlUcmVlTm9kZShudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgcm9vdE5vZGUgPSBuZXcgS2V5VHJlZU5vZGUobnVsbCwgbnVsbCwgbnVsbCwgbWVzc2FnZXNCdW5kbGVHcm91cCk7CiAgICAgICAgIFN0cmluZ1tdIGtleXMgPSBtZXNzYWdlc0J1bmRsZUdyb3VwLmdldE1lc3NhZ2VLZXlzKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogCQkJU3RyaW5nIGtleSA9IGtleXNbaV07CkBAIC0yNTUsOSArMjY2LDkgQEAKICAgICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdG9rZW5zLm5leHRUb2tlbigpOwogICAgICAgICAgICAgYnVuZGxlS2V5UGFydCArPSBuYW1lOwotICAgICAgICAgICAgS2V5VHJlZU5vZGUgY2hpbGQgPSBub2RlLmdldENoaWxkKG5hbWUpOworICAgICAgICAgICAgS2V5VHJlZU5vZGUgY2hpbGQgPSAoS2V5VHJlZU5vZGUpIG5vZGUuZ2V0Q2hpbGQobmFtZSk7CiAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoaWxkID0gbmV3IEtleVRyZWVOb2RlKG5vZGUsIG5hbWUsIGJ1bmRsZUtleVBhcnQpOworICAgICAgICAgICAgICAgIGNoaWxkID0gbmV3IEtleVRyZWVOb2RlKG5vZGUsIG5hbWUsIGJ1bmRsZUtleVBhcnQsIG1lc3NhZ2VzQnVuZGxlR3JvdXApOwogICAgICAgICAgICAgICAgIGZpcmVOb2RlQWRkZWQoY2hpbGQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnVuZGxlS2V5UGFydCArPSBkZWxpbWl0ZXI7CkBAIC0yNzMsMjMgKzI4NCwyMyBAQAogICAgICAgICBLZXlUcmVlTm9kZSBub2RlID0gcm9vdE5vZGU7CiAgICAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldENoaWxkKG5hbWUpOworICAgICAgICAgICAgbm9kZSA9IChLZXlUcmVlTm9kZSkgbm9kZS5nZXRDaGlsZChuYW1lKTsKICAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAgICAgICAgICAgICAgICAgICAgICJObyBSZWdFeCBub2RlIG1hdGNoaW5nIGJ1bmRsZUtleSB0byByZW1vdmUiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBLZXlUcmVlTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgS2V5VHJlZU5vZGUgcGFyZW50Tm9kZSA9IChLZXlUcmVlTm9kZSkgbm9kZS5nZXRQYXJlbnQoKTsKICAgICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICAgZmlyZU5vZGVSZW1vdmVkKG5vZGUpOwogICAgICAgICB3aGlsZSAocGFyZW50Tm9kZSAhPSByb290Tm9kZSkgewogICAgICAgICAgICAgaWYgKCFwYXJlbnROb2RlLmhhc0NoaWxkcmVuKCkgJiYgIW1lc3NhZ2VzQnVuZGxlR3JvdXAuaXNNZXNzYWdlS2V5KAogICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmdldE1lc3NhZ2VLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKHBhcmVudE5vZGUpOworICAgICAgICAgICAgICAgICgoS2V5VHJlZU5vZGUpcGFyZW50Tm9kZS5nZXRQYXJlbnQoKSkucmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSk7CiAgICAgICAgICAgICAgICAgZmlyZU5vZGVSZW1vdmVkKHBhcmVudE5vZGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBwYXJlbnROb2RlID0gKEtleVRyZWVOb2RlKXBhcmVudE5vZGUuZ2V0UGFyZW50KCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCkBAIC0yOTksNyArMzEwLDI3IEBACiAgICAgCSAqIEBwYXJhbSBsZWFmTm9kZSBBIGxlYWYgbm9kZS4gTXVzdCBub3QgYmUgY2FsbGVkIGlmIHRoZSBub2RlIGhhcyBjaGlsZHJlbgogICAgIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIHNob3VsZCBiZSBmaWx0ZXJlZC4KICAgICAJICovCi0gICAgCWJvb2xlYW4gaXNGaWx0ZXJlZExlYWYoS2V5VHJlZU5vZGUgbGVhZk5vZGUpOworICAgIAlib29sZWFuIGlzRmlsdGVyZWRMZWFmKElLZXlUcmVlTm9kZSBsZWFmTm9kZSk7CisgICAgfQorCisgICAgcHVibGljIElLZXlUcmVlTm9kZSBnZXRDaGlsZChTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiByZXR1cm5Ob2RlV2l0aEtleShrZXksIHJvb3ROb2RlKTsKICAgICB9CiAgICAgCisgICAgcHJpdmF0ZSBJS2V5VHJlZU5vZGUgcmV0dXJuTm9kZVdpdGhLZXkoU3RyaW5nIGtleSwgSUtleVRyZWVOb2RlIG5vZGUpIHsKKyAgICAgICAgCisgICAgICAgICBpZiAoIWtleS5lcXVhbHMobm9kZS5nZXRNZXNzYWdlS2V5KCkpKSB7CisgICAgICAgICAgICBmb3IgKElLZXlUcmVlTm9kZSBuIDogbm9kZS5nZXRDaGlsZHJlbigpKSB7CisgICAgICAgICAgICAgICAgSUtleVRyZWVOb2RlIHJldHVybk5vZGUgPSByZXR1cm5Ob2RlV2l0aEtleShrZXksIG4pOworICAgICAgICAgICAgCWlmIChyZXR1cm5Ob2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybk5vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvSUtleVRyZWVNb2RlbExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9pbnRlcm5hbC9JS2V5VHJlZU1vZGVsTGlzdGVuZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9JS2V5VHJlZU1vZGVsTGlzdGVuZXIuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvaW50ZXJuYWwvSUtleVRyZWVNb2RlbExpc3RlbmVyLmphdmEKaW5kZXggNDZlZGRhYy4uOThiZWNlMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvSUtleVRyZWVNb2RlbExpc3RlbmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvaW50ZXJuYWwvSUtleVRyZWVNb2RlbExpc3RlbmVyLmphdmEKQEAgLTgsNyArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZTsKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuaW50ZXJuYWw7CiAKIC8qKgogICogTGlzdGVuZXIgbm90aWZpZWQgb2YgY2hhbmdlcyB0byBhIHtAbGluayBJS2V5VHJlZU1vZGVsfS4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL0tleVRyZWVOb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9pbnRlcm5hbC9LZXlUcmVlTm9kZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzMlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL0tleVRyZWVOb2RlLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL2ludGVybmFsL0tleVRyZWVOb2RlLmphdmEKaW5kZXggMGM0NjlkYi4uNmIwZmQ5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvS2V5VHJlZU5vZGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS9pbnRlcm5hbC9LZXlUcmVlTm9kZS5qYXZhCkBAIC04LDcgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWU7CitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTE2LDYgKzE2LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLklLZXlUcmVlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWwuQmFiZWxVdGlsczsKIAogLyoqCkBAIC0yMyw3ICsyNSw3IEBACiAgKgogICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlCiAgKi8KLXB1YmxpYyBjbGFzcyBLZXlUcmVlTm9kZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8S2V5VHJlZU5vZGU+IHsKK3B1YmxpYyBjbGFzcyBLZXlUcmVlTm9kZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8S2V5VHJlZU5vZGU+LCBJS2V5VHJlZU5vZGUgewogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXlUcmVlTm9kZVtdIEVNUFRZX0tFWV9UUkVFX05PREVTID0KICAgICAgICAgICAgIG5ldyBLZXlUcmVlTm9kZVtdIHt9OwpAQCAtMzMsNyArMzUsNyBAQAogICAgICAqIHRoZSBzYW1lIGFzIHRoaXMgb2JqZWN0IGJ1dCB3aXRoIHRoZSBsYXN0IGNvbXBvbmVudCAoZm9sbG93aW5nIHRoZQogICAgICAqIGxhc3QgcGVyaW9kKSByZW1vdmVkCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBLZXlUcmVlTm9kZSBwYXJlbnQ7CisgICAgcHJpdmF0ZSBJS2V5VHJlZU5vZGUgcGFyZW50OwogICAgIAogICAgIC8qKgogICAgICAqIHRoZSBuYW1lLCBiZWluZyB0aGUgcGFydCBvZiB0aGUgZnVsbCBrZXkgdGhhdCBmb2xsb3dzIHRoZSBsYXN0IHBlcmlvZApAQCAtNDcsOSArNDksMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlS2V5OwogICAgIAotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgS2V5VHJlZU5vZGU+IGNoaWxkcmVuID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBLZXlUcmVlTm9kZT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElLZXlUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgVHJlZU1hcDxTdHJpbmcsIElLZXlUcmVlTm9kZT4oKTsKIAogCXByaXZhdGUgYm9vbGVhbiB1c2VkQXNLZXkgPSBmYWxzZTsKKwkKKwlwcml2YXRlIElNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXA7CiAgICAgCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuCkBAIC01OCw3ICs2Miw3IEBACiAgICAgICogQHBhcmFtIG1lc3NhZ2VLZXkgbWVzc2FnZXMgYnVuZGxlIGtleQogICAgICAqLwogICAgIHB1YmxpYyBLZXlUcmVlTm9kZSgKLSAgICAJCUtleVRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlS2V5KSB7CisgICAgCQlJS2V5VHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2VLZXksIElNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXApIHsKICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CkBAIC02Niw2ICs3MCw3IEBACiAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgcGFyZW50LmFkZENoaWxkKHRoaXMpOwogICAgICAgICB9CisgICAgICAgIHRoaXMubWVzc2FnZXNCdW5kbGVHcm91cCA9IG1lc3NhZ2VzQnVuZGxlR3JvdXA7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MCw3ICs4NSw3IEBACiAgICAgICogdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QgYnV0IHdpdGggdGhlIGxhc3QgY29tcG9uZW50IChmb2xsb3dpbmcgdGhlCiAgICAgICogbGFzdCBwZXJpb2QpIHJlbW92ZWQKICAgICAgKi8KLSAgICBwdWJsaWMgS2V5VHJlZU5vZGUgZ2V0UGFyZW50KCkgeworICAgIHB1YmxpYyBJS2V5VHJlZU5vZGUgZ2V0UGFyZW50KCkgewogICAgICAgICByZXR1cm4gcGFyZW50OwogICAgIH0KIApAQCAtOTcsOSArMTAyLDkgQEAKICAgICAgKiBHZXRzIGFsbCBub3RlcyBmcm9tIHJvb3QgdG8gdGhpcyBub2RlLgogICAgICAqIEByZXR1cm4gYWxsIG5vdGVzIGZyb20gcm9vdCB0byB0aGlzIG5vZGUKICAgICAgKi8KLSAgICAvKmRlZmF1bHQqLyBLZXlUcmVlTm9kZVtdIGdldFBhdGgoKSB7Ci0gICAgICAgIExpc3Q8S2V5VHJlZU5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxLZXlUcmVlTm9kZT4oKTsKLSAgICAgICAgS2V5VHJlZU5vZGUgbm9kZSA9IHRoaXM7CisgICAgLypkZWZhdWx0Ki8gSUtleVRyZWVOb2RlW10gZ2V0UGF0aCgpIHsKKyAgICAgICAgTGlzdDxJS2V5VHJlZU5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxJS2V5VHJlZU5vZGU+KCk7CisgICAgICAgIElLZXlUcmVlTm9kZSBub2RlID0gdGhpczsKICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5hbWUoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBub2Rlcy5hZGQoMCwgbm9kZSk7CiAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnQoKTsKQEAgLTEwNywyMCArMTEyLDIwIEBACiAgICAgICAgIHJldHVybiBub2Rlcy50b0FycmF5KEVNUFRZX0tFWV9UUkVFX05PREVTKTsKICAgICB9CiAKLSAgICBwdWJsaWMgS2V5VHJlZU5vZGVbXSBnZXRDaGlsZHJlbigpIHsKKyAgICBwdWJsaWMgSUtleVRyZWVOb2RlW10gZ2V0Q2hpbGRyZW4oKSB7CiAgICAgICAgIHJldHVybiBjaGlsZHJlbi52YWx1ZXMoKS50b0FycmF5KEVNUFRZX0tFWV9UUkVFX05PREVTKTsKICAgICB9CiAgICAgLypkZWZhdWx0Ki8gYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKICAgICAgICAgcmV0dXJuICFjaGlsZHJlbi5pc0VtcHR5KCk7CiAgICAgfQotICAgIHB1YmxpYyBLZXlUcmVlTm9kZSBnZXRDaGlsZChTdHJpbmcgY2hpbGROYW1lKSB7CisgICAgcHVibGljIElLZXlUcmVlTm9kZSBnZXRDaGlsZChTdHJpbmcgY2hpbGROYW1lKSB7CiAgICAgICAgIHJldHVybiBjaGlsZHJlbi5nZXQoY2hpbGROYW1lKTsKICAgICB9CiAgICAgCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0aGUgY2hpbGRyZW4gd2l0aG91dCBjcmVhdGluZyBhIG5ldyBvYmplY3QKICAgICAgKi8KLSAgICBDb2xsZWN0aW9uPEtleVRyZWVOb2RlPiBnZXRDaGlsZHJlbkludGVybmFsKCkgeworICAgIENvbGxlY3Rpb248SUtleVRyZWVOb2RlPiBnZXRDaGlsZHJlbkludGVybmFsKCkgewogICAgIAlyZXR1cm4gY2hpbGRyZW4udmFsdWVzKCk7CiAgICAgfQogICAgIApAQCAtMTQ1LDcgKzE1MCw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgS2V5VHJlZU5vZGUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgfSAKICAgICAgICAgS2V5VHJlZU5vZGUgbm9kZSA9IChLZXlUcmVlTm9kZSkgb2JqOwogICAgICAgICByZXR1cm4gQmFiZWxVdGlscy5lcXVhbHMobmFtZSwgbm9kZS5uYW1lKQogICAgICAgICAgICAgICAgICYmIEJhYmVsVXRpbHMuZXF1YWxzKHBhcmVudCwgbm9kZS5wYXJlbnQpOwpAQCAtMTU1LDE1ICsxNjAsMTYgQEAKICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiS2V5VHJlZU5vZGU9W1twYXJlbnQ9IiArIHBhcmVudCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICsgIl1bbmFtZT0iICsgbmFtZSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICsgIl1bbWVzc2FnZUtleT0iICsgbWVzc2FnZUtleSArICJdXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgIAlyZXR1cm4gbWVzc2FnZUtleTsKKy8vICAgICAgICByZXR1cm4gIktleVRyZWVOb2RlPVtbcGFyZW50PSIgKyBwYXJlbnQgLy8kTk9OLU5MUy0xJAorLy8gICAgICAgICAgICAgICsgIl1bbmFtZT0iICsgbmFtZSAvLyROT04tTkxTLTEkCisvLyAgICAgICAgICAgICAgKyAiXVttZXNzYWdlS2V5PSIgKyBtZXNzYWdlS2V5ICsgIl1dIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgfQogCi0gICAgLypkZWZhdWx0Ki8gdm9pZCBhZGRDaGlsZChLZXlUcmVlTm9kZSBjaGlsZE5vZGUpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChJS2V5VHJlZU5vZGUgY2hpbGROb2RlKSB7CiAgICAgICAgIGNoaWxkcmVuLnB1dChjaGlsZE5vZGUuZ2V0TmFtZSgpLCBjaGlsZE5vZGUpOwogICAgIH0KLSAgICAvKmRlZmF1bHQqLyB2b2lkIHJlbW92ZUNoaWxkKEtleVRyZWVOb2RlIGNoaWxkTm9kZSkgeworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKEtleVRyZWVOb2RlIGNoaWxkTm9kZSkgewogICAgICAgICBjaGlsZHJlbi5yZW1vdmUoY2hpbGROb2RlLmdldE5hbWUoKSk7CiAgICAgICAgIC8vVE9ETyByZW1vdmUgcGFyZW50IG9uIGNoaWxkIG5vZGU/CiAgICAgfQpAQCAtMTcyLDE3ICsxNzgsMTcgQEAKIAlwdWJsaWMgQ29sbGVjdGlvbjxLZXlUcmVlTm9kZT4gZ2V0QnJhbmNoKCkgewogICAgICAgICBDb2xsZWN0aW9uPEtleVRyZWVOb2RlPiBjaGlsZE5vZGVzID0gbmV3IEFycmF5TGlzdDxLZXlUcmVlTm9kZT4oKTsKICAgICAgICAgY2hpbGROb2Rlcy5hZGQodGhpcyk7Ci0gICAgICAgIGZvciAoS2V5VHJlZU5vZGUgY2hpbGROb2RlIDogdGhpcy5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBjaGlsZE5vZGVzLmFkZEFsbChjaGlsZE5vZGUuZ2V0QnJhbmNoKCkpOworICAgICAgICBmb3IgKElLZXlUcmVlTm9kZSBjaGlsZE5vZGUgOiB0aGlzLmdldENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgIGNoaWxkTm9kZXMuYWRkQWxsKCgoS2V5VHJlZU5vZGUpY2hpbGROb2RlKS5nZXRCcmFuY2goKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNoaWxkTm9kZXM7CiAJfQogCi0JcHVibGljIENvbGxlY3Rpb248S2V5VHJlZU5vZGU+IGdldERlc2NlbmRhbnRzKCkgewotCQlDb2xsZWN0aW9uPEtleVRyZWVOb2RlPiBkZXNjZW5kYW50cyA9IG5ldyBBcnJheUxpc3Q8S2V5VHJlZU5vZGU+KCk7Ci0JCWZvciAoS2V5VHJlZU5vZGUgY2hpbGQgOiBjaGlsZHJlbi52YWx1ZXMoKSkgeworCXB1YmxpYyBDb2xsZWN0aW9uPElLZXlUcmVlTm9kZT4gZ2V0RGVzY2VuZGFudHMoKSB7CisJCUNvbGxlY3Rpb248SUtleVRyZWVOb2RlPiBkZXNjZW5kYW50cyA9IG5ldyBBcnJheUxpc3Q8SUtleVRyZWVOb2RlPigpOworCQlmb3IgKElLZXlUcmVlTm9kZSBjaGlsZCA6IGNoaWxkcmVuLnZhbHVlcygpKSB7CiAJCQlkZXNjZW5kYW50cy5hZGQoY2hpbGQpOwotCQkJZGVzY2VuZGFudHMuYWRkQWxsKGNoaWxkLmdldERlc2NlbmRhbnRzKCkpOworCQkJZGVzY2VuZGFudHMuYWRkQWxsKCgoS2V5VHJlZU5vZGUpY2hpbGQpLmdldERlc2NlbmRhbnRzKCkpOwogCQl9CiAJCXJldHVybiBkZXNjZW5kYW50czsKIAl9CkBAIC0yMDcsNSArMjEzLDEzIEBACiAJcHVibGljIGJvb2xlYW4gaXNVc2VkQXNLZXkoKSB7CiAJCXJldHVybiB1c2VkQXNLZXk7CiAJfQorCQorCXB1YmxpYyBJTWVzc2FnZXNCdW5kbGVHcm91cCBnZXRNZXNzYWdlc0J1bmRsZUdyb3VwKCkgeworCSAgICByZXR1cm4gdGhpcy5tZXNzYWdlc0J1bmRsZUdyb3VwOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSUtleVRyZWVOb2RlIHBhcmVudE5vZGUpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlOworICAgIH0KICAgICAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL3Zpc2l0b3IvSUtleUNoZWNrLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS92aXNpdG9yL0lLZXlDaGVjay5qYXZhCmluZGV4IGQ1YmQ2MDcuLjVhMzg0N2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL3Zpc2l0b3IvSUtleUNoZWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvdmlzaXRvci9JS2V5Q2hlY2suamF2YQpAQCAtMTAsNyArMTAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUudmlzaXRvcjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZUdyb3VwOwogCiAvKioKICAqIEFsbCBwdXJwb3NlIGtleSB0ZXN0aW5nLiAgIFVzZSB0aGlzIGludGVyZmFjZSB0byBlc3RhYmxpc2ggd2hldGhlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvdmlzaXRvci9LZXlDaGVja1Zpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL3Zpc2l0b3IvS2V5Q2hlY2tWaXNpdG9yLmphdmEKaW5kZXggNGE5OTE1NS4uNmY5MjA0MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvdmlzaXRvci9LZXlDaGVja1Zpc2l0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS92aXNpdG9yL0tleUNoZWNrVmlzaXRvci5qYXZhCkBAIC0xMyw4ICsxMywxMCBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5LZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuSUtleVRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsLktleVRyZWVOb2RlOwogCiAKIC8qKgpAQCAtMjksOCArMzEsOCBAQAogICAgIHByaXZhdGUgSUtleUNoZWNrIGtleUNoZWNrOwogICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwOwogICAgIAotICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxLZXlUcmVlTm9kZT4gcGFzc2VkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PEtleVRyZWVOb2RlPigpOwotICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxLZXlUcmVlTm9kZT4gZmFpbGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PEtleVRyZWVOb2RlPigpOworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxJS2V5VHJlZU5vZGU+IHBhc3NlZE5vZGVzID0gbmV3IEFycmF5TGlzdDxJS2V5VHJlZU5vZGU+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPElLZXlUcmVlTm9kZT4gZmFpbGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PElLZXlUcmVlTm9kZT4oKTsKICAgICAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KQEAgLTUwLDExICs1MiwxMSBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLnZpc2l0b3IuSUtleVRyZWVWaXNpdG9yCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwudHJlZS52aXNpdG9yLklLZXlUcmVlVmlzaXRvcgogICAgICAqICAgICAgI3Zpc2l0S2V5VHJlZU5vZGUoCi0gICAgICogICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLktleVRyZWVOb2RlKQorICAgICAqICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwudHJlZS5pbnRlcm5hbC5LZXlUcmVlTm9kZSkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEtleVRyZWVOb2RlKEtleVRyZWVOb2RlIG5vZGUpIHsKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEtleVRyZWVOb2RlKElLZXlUcmVlTm9kZSBub2RlKSB7CiAgICAgICAgIGlmIChrZXlDaGVjayA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL3Zpc2l0b3IvTm9kZVBhdGhSZWdleFZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvbWVzc2FnZS90cmVlL3Zpc2l0b3IvTm9kZVBhdGhSZWdleFZpc2l0b3IuamF2YQppbmRleCA4NzZkZmZhLi45MDM1MjQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL21lc3NhZ2UvdHJlZS92aXNpdG9yL05vZGVQYXRoUmVnZXhWaXNpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS9tZXNzYWdlL3RyZWUvdmlzaXRvci9Ob2RlUGF0aFJlZ2V4VmlzaXRvci5qYXZhCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLktleVRyZWVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLklLZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZVZpc2l0b3I7CiAKIC8qKgogICogVmlzaXRvciBmb3IgZmluZGluZyBrZXlzIG1hdGNoaW5nIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uCkBAIC0yMiw3ICsyMyw3IEBACiBwdWJsaWMgY2xhc3MgTm9kZVBhdGhSZWdleFZpc2l0b3IgaW1wbGVtZW50cyBJS2V5VHJlZVZpc2l0b3IgewogCiAgICAgLyoqIEhvbGRlciBmb3IgbWF0Y2hpbmcga2V5cy4gKi8KLSAgICBwcml2YXRlIExpc3Q8S2V5VHJlZU5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxLZXlUcmVlTm9kZT4oKTsKKyAgICBwcml2YXRlIExpc3Q8SUtleVRyZWVOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8SUtleVRyZWVOb2RlPigpOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlZ2V4OwogICAgIAogICAgIC8qKgpAQCAtMzQsMTAgKzM1LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS52aXNpdG9yLklLZXlUcmVlVmlzaXRvcgotICAgICAqICAgICAgI3Zpc2l0S2V5VHJlZU5vZGUob3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuS2V5VHJlZU5vZGUpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwudHJlZS52aXNpdG9yLklLZXlUcmVlVmlzaXRvcgorICAgICAqICAgICAgI3Zpc2l0S2V5VHJlZU5vZGUob3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLnRyZWUuaW50ZXJuYWwuS2V5VHJlZU5vZGUpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXRLZXlUcmVlTm9kZShLZXlUcmVlTm9kZSBub2RlKSB7CisgICAgcHVibGljIHZvaWQgdmlzaXRLZXlUcmVlTm9kZShJS2V5VHJlZU5vZGUgbm9kZSkgewogICAgICAgICBpZiAobm9kZS5nZXRNZXNzYWdlS2V5KCkubWF0Y2hlcyhyZWdleCkpIHsKICAgICAgICAgICAgIG5vZGVzLmFkZChub2RlKTsKICAgICAgICAgfQpAQCAtNDcsNyArNDgsNyBAQAogICAgICAqIEdldHMgbWF0Y2hpbmcga2V5IHRyZWUgbm9kZXMuCiAgICAgICogQHJldHVybiBtYXRjaGluZyBrZXkgdHJlZSBub2RlcwogICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEtleVRyZWVOb2RlPiBnZXRLZXlUcmVlTm9kZXMoKSB7CisgICAgcHVibGljIExpc3Q8SUtleVRyZWVOb2RlPiBnZXRLZXlUcmVlTm9kZXMoKSB7CiAgICAgICAgIHJldHVybiBub2RlczsKICAgICB9CiAKQEAgLTU3LDcgKzU4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEtleVRyZWVOb2RlUGF0aHMoKSB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihub2Rlcy5zaXplKCkpOwotICAgICAgICBmb3IgKEtleVRyZWVOb2RlIG5vZGUgOiBub2RlcykgeworICAgICAgICBmb3IgKElLZXlUcmVlTm9kZSBub2RlIDogbm9kZXMpIHsKICAgICAgICAgICAgIHBhdGhzLmFkZChub2RlLmdldE1lc3NhZ2VLZXkoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBhdGhzOwpAQCAtNjgsNyArNjksNyBAQAogICAgICAqIEdldHMgdGhlIGZpcnN0IGl0ZW0gbWF0Y2hlZC4KICAgICAgKiBAcmV0dXJuIGZpcnN0IGl0ZW0gbWF0Y2hlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB3YXMgZm91bmQKICAgICAgKi8KLSAgICBwdWJsaWMgS2V5VHJlZU5vZGUgZ2V0S2V5VHJlZU5vZGUoKSB7CisgICAgcHVibGljIElLZXlUcmVlTm9kZSBnZXRLZXlUcmVlTm9kZSgpIHsKICAgICAgICAgaWYgKG5vZGVzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIHJldHVybiBub2Rlcy5nZXQoMCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvdXRpbC9GaWxlVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvdXRpbC9GaWxlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzBhNGFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS91dGlsL0ZpbGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQWxleGVqIFN0cmVsem93LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEFsZXhlaiBTdHJlbHpvdyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuY29yZS51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5jb25maWd1cmF0aW9uLkRpcnR5SGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuSU1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIuUHJvcGVydGllc1NlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKKworLyoqCisgKiBVdGlsIGNsYXNzIGZvciBGaWxlLUkvTyBvcGVyYXRpb25zLgorICogCisgKiBAYXV0aG9yIEFsZXhlaiBTdHJlbHpvdworICovCitwdWJsaWMgY2xhc3MgRmlsZVV0aWxzIHsKKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoSU1lc3NhZ2VzQnVuZGxlIGJ1bmRsZSkgeworCQlEaXJ0eUhhY2suc2V0RWRpdG9yTW9kaWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7CisKKwkJUHJvcGVydGllc1NlcmlhbGl6ZXIgcHMgPSBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIoQ29uZmlndXJhdGlvbk1hbmFnZXIKKwkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRTZXJpYWxpemVyQ29uZmlnKCkpOworCQlTdHJpbmcgZWRpdG9yQ29udGVudCA9IHBzLnNlcmlhbGl6ZShidW5kbGUpOworCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShidW5kbGUpOworCQl0cnkgeworCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOworCQkJZmlsZS5zZXRDb250ZW50cygKKwkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVkaXRvckNvbnRlbnQuZ2V0Qnl0ZXMoKSksIGZhbHNlLAorCQkJCQl0cnVlLCBudWxsKTsKKwkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gZmluYWxseSB7CisJCQlEaXJ0eUhhY2suc2V0RWRpdG9yTW9kaWZpY2F0aW9uRW5hYmxlZCh0cnVlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoSU1lc3NhZ2VzQnVuZGxlIGJ1bmRsZSkgeworCQlpZiAoYnVuZGxlLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzRmlsZVJlc291cmNlKSB7IC8vIGRpZmZlcmVudAorCQkJLy8gUmVzb3VyY2VMb2NhdGlvbkxhYmVsCisJCQlTdHJpbmcgcGF0aCA9IGJ1bmRsZS5nZXRSZXNvdXJjZSgpLmdldFJlc291cmNlTG9jYXRpb25MYWJlbCgpOyAvLyBQOlxXb3Jrc3BhY2VcQVNUXFRFU1Rcc3JjXG1lc3NhZ2VzXE1lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKwkJCWludCBpbmRleCA9IHBhdGguaW5kZXhPZigic3JjIik7CisJCQlTdHJpbmcgcGF0aEJlZm9yZVNyYyA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4IC0gMSk7CisJCQlpbnQgbGFzdEluZGV4T2YgPSBwYXRoQmVmb3JlU3JjLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7CisJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwYXRoLnN1YnN0cmluZyhsYXN0SW5kZXhPZiArIDEsIGluZGV4IC0gMSk7CisJCQlTdHJpbmcgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGguc3Vic3RyaW5nKGluZGV4LCBwYXRoLmxlbmd0aCgpKTsKKworCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKKwkJCQkJLmdldFByb2plY3QocHJvamVjdE5hbWUpLmdldEZpbGUocmVsYXRpdmVGaWxlUGF0aCk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgbG9jYXRpb24gPSBidW5kbGUuZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZUxvY2F0aW9uTGFiZWwoKTsgLy8gL1RFU1Qvc3JjL21lc3NhZ2VzL01lc3NhZ2VzX2VuX0lOLnByb3BlcnRpZXMKKwkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGxvY2F0aW9uLnN1YnN0cmluZygxLCBsb2NhdGlvbi5pbmRleE9mKCIvIiwgMSkpOworCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5zdWJzdHJpbmcocHJvamVjdE5hbWUubGVuZ3RoKCkgKyAxLAorCQkJCQlsb2NhdGlvbi5sZW5ndGgoKSk7CisJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQorCQkJCQkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkuZ2V0RmlsZShsb2NhdGlvbik7CisJCX0KKwl9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL3V0aWwvTmFtZVV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL3V0aWwvTmFtZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3N2Y1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JhYmVsL2NvcmUvdXRpbC9OYW1lVXRpbHMuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFsZXhlaiBTdHJlbHpvdy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBBbGV4ZWogU3RyZWx6b3cgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CisKKy8qKgorICogQ29udGFpbnMgbWV0aG9kcywgd2hpY2ggcmV0dXJuIG5hbWVzL0lEcyBvciBPYmplY3RzIGJ5IG5hbWUuCisgKiAKKyAqIEBhdXRob3IgQWxleGVqIFN0cmVsem93CisgKi8KK3B1YmxpYyBjbGFzcyBOYW1lVXRpbHMgeworCisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVJZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJU3RyaW5nIHBhY2thZ2VGcmFnbWVudCA9ICIiOworCisJCUlKYXZhRWxlbWVudCBwcm9wZXJ0eUZpbGUgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UGFyZW50KCkpOworCQlpZiAocHJvcGVydHlGaWxlICE9IG51bGwgJiYgcHJvcGVydHlGaWxlIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkKKwkJCXBhY2thZ2VGcmFnbWVudCA9ICgoSVBhY2thZ2VGcmFnbWVudCkgcHJvcGVydHlGaWxlKQorCQkJCQkuZ2V0RWxlbWVudE5hbWUoKTsKKworCQlyZXR1cm4gKHBhY2thZ2VGcmFnbWVudC5sZW5ndGgoKSA+IDAgPyBwYWNrYWdlRnJhZ21lbnQgKyAiLiIgOiAiIikKKwkJCQkrIGdldFJlc291cmNlQnVuZGxlTmFtZShyZXNvdXJjZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKElSZXNvdXJjZSByZXMpIHsKKwkJU3RyaW5nIG5hbWUgPSByZXMuZ2V0TmFtZSgpOworCQlTdHJpbmcgcmVnZXggPSAiXiguKj8pIiAvLyROT04tTkxTLTEkCisJCQkJKyAiKChfW2Etel17MiwzfSl8KF9bYS16XXsyLDN9X1tBLVpdezJ9KSIgLy8kTk9OLU5MUy0xJAorCQkJCSsgInwoX1thLXpdezIsM31fW0EtWl17Mn1fXFx3KikpPyhcXC4iIC8vJE5PTi1OTFMtMSQKKwkJCQkrIHJlcy5nZXRGaWxlRXh0ZW5zaW9uKCkgKyAiKSQiOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBuYW1lLnJlcGxhY2VGaXJzdChyZWdleCwgIiQxIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJcHVibGljIHN0YXRpYyBMb2NhbGUgZ2V0TG9jYWxlQnlOYW1lKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbG9jYWxlSUQpIHsKKwkJU3RyaW5nIHRoZUJ1bmRsZU5hbWUgPSBidW5kbGVOYW1lOworCQlpZiAodGhlQnVuZGxlTmFtZS5jb250YWlucygiLiIpKSB7CisJCQkvLyB3ZSBlbnRlcmVkIHRoaXMgbWV0aG9kIHdpdGggdGhlIHJiSUQgYW5kIG5vdCB0aGUgbmFtZSEKKwkJCXRoZUJ1bmRsZU5hbWUgPSB0aGVCdW5kbGVOYW1lLnN1YnN0cmluZyh0aGVCdW5kbGVOYW1lLmluZGV4T2YoIi4iKSArIDEpOworCQl9CisJCQorCQkvLyBDaGVjayBsb2NhbGUKKwkJTG9jYWxlIGxvY2FsZSA9IG51bGw7CisJCWxvY2FsZUlEID0gbG9jYWxlSUQuc3Vic3RyaW5nKDAsCisJCQkJbG9jYWxlSUQubGVuZ3RoKCkgLSAicHJvcGVydGllcyIubGVuZ3RoKCkgLSAxKTsKKwkJaWYgKGxvY2FsZUlELmxlbmd0aCgpID09IHRoZUJ1bmRsZU5hbWUubGVuZ3RoKCkpIHsKKwkJCS8vIGRlZmF1bHQgbG9jYWxlCisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCWxvY2FsZUlEID0gbG9jYWxlSUQuc3Vic3RyaW5nKHRoZUJ1bmRsZU5hbWUubGVuZ3RoKCkgKyAxKTsKKwkJCVN0cmluZ1tdIGxvY2FsZVRva2VucyA9IGxvY2FsZUlELnNwbGl0KCJfIik7CisKKwkJCXN3aXRjaCAobG9jYWxlVG9rZW5zLmxlbmd0aCkgeworCQkJY2FzZSAxOgorCQkJCWxvY2FsZSA9IG5ldyBMb2NhbGUobG9jYWxlVG9rZW5zWzBdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlsb2NhbGUgPSBuZXcgTG9jYWxlKGxvY2FsZVRva2Vuc1swXSwgbG9jYWxlVG9rZW5zWzFdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlsb2NhbGUgPSBuZXcgTG9jYWxlKGxvY2FsZVRva2Vuc1swXSwgbG9jYWxlVG9rZW5zWzFdLAorCQkJCQkJbG9jYWxlVG9rZW5zWzJdKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbG9jYWxlID0gbnVsbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJldHVybiBsb2NhbGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS91dGlsL1BERVV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9jb3JlL3V0aWwvUERFVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVlYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuY29yZS9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvY29yZS91dGlsL1BERVV0aWxzLmphdmEKQEAgLTAsMCArMSwyNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFuIFJlaXRlcmVyLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBSZWl0ZXJlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5Ib3N0U3BlY2lmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSUZyYWdtZW50TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLklQbHVnaW5CYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5JUGx1Z2luTW9kZWxCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5QbHVnaW5SZWdpc3RyeTsKKworcHVibGljIGNsYXNzIFBERVV0aWxzIHsKKworCS8vIFRoZSBzYW1lIGFzIFBERS5QTFVHSU5fTkFUVVJFLCBiZWNhdXNlIHRoZSBQREUgcHJvdmlkZWQgY29uc3RhbnQgaXMgbm90IGFjY2Vzc2libGUgKGludGVybmFsIGNsYXNzKSAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX05BVFVSRSA9ICJvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlIjsKKworCS8qKiAKKwkgKiBHZXQgdGhlIHByb2plY3QncyBwbHVnLWluIElkIGlmIHRoZSBnaXZlbiBwcm9qZWN0IGlzIGFuIGVjbGlwc2UgcGx1Zy1pbi4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdCB0aGUgd29ya3NwYWNlIHByb2plY3QuCisJICogQHJldHVybiB0aGUgcHJvamVjdCdzIHBsdWctaW4gSWQuIE51bGwgaWYgdGhlIHByb2plY3QgaXMgbm8gcGx1Zy1pbiBwcm9qZWN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKElQcm9qZWN0IHByb2plY3QpIHsKKworCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFpc1BsdWdpblByb2plY3QocHJvamVjdCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJSVBsdWdpbk1vZGVsQmFzZSBwbHVnaW5Nb2RlbEJhc2UgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwocHJvamVjdCk7CisJCQorCQlpZiAocGx1Z2luTW9kZWxCYXNlID09IG51bGwpIHsKKwkJCS8vIHBsdWdpbiBub3QgZm91bmQgaW4gcmVnaXN0cnkKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlJUGx1Z2luQmFzZSBwbHVnaW5CYXNlID0gcGx1Z2luTW9kZWxCYXNlLmdldFBsdWdpbkJhc2UoKTsKKworCQlyZXR1cm4gcGx1Z2luQmFzZS5nZXRJZCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHByb2plY3QgY29udGFpbmluZyBwbHVnaW4vZnJhZ21lbnQgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0LgorCSAqIElmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpdHNlbGYgaXMgYSBmcmFnbWVudCwgdGhlbiBvbmx5IHRoaXMgaXMKKwkgKiByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gcGx1Z2luUHJvamVjdAorCSAqICAgICAgICAgICAgdGhlIHBsdWdpbiBwcm9qZWN0CisJICogQHJldHVybiB0aGUgYWxsIHByb2plY3QgY29udGFpbmluZyBhIGZyYWdtZW50IG9yIG51bGwgaWYgbm9uZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBsb29rdXBGcmFnbWVudChJUHJvamVjdCBwbHVnaW5Qcm9qZWN0KSB7CisJCWlmIChpc0ZyYWdtZW50KHBsdWdpblByb2plY3QpICYmIHBsdWdpblByb2plY3QuaXNPcGVuKCkpIHsKKwkJCXJldHVybiBuZXcgSVByb2plY3RbXSB7cGx1Z2luUHJvamVjdH07CisJCX0KKwkJCisJCUlQcm9qZWN0W10gd29ya3NwYWNlUHJvamVjdHMgPSBwbHVnaW5Qcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOworCQlTdHJpbmcgaG9zdFBsdWdpbklkID0gZ2V0UGx1Z2luSWQocGx1Z2luUHJvamVjdCk7CisJCQorCQlpZiAoaG9zdFBsdWdpbklkID09IG51bGwpIHsKKwkJCS8vIHByb2plY3QgaXMgbm90IGEgcGx1Z2luIHByb2plY3QKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlMaXN0PElQcm9qZWN0PiBmcmFnbWVudFByb2plY3RzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKKwkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogd29ya3NwYWNlUHJvamVjdHMpIHsKKwkJCWlmICghcHJvamVjdC5pc09wZW4oKSB8fCBnZXRGcmFnbWVudElkKHByb2plY3QsIGhvc3RQbHVnaW5JZCkgPT0gbnVsbCkgeworCQkJCS8vIHByb2plY3QgaXMgbm90IG9wZW4gb3IgaXQgaXMgbm8gZnJhZ21lbnQgd2hlcmUgZ2l2ZW4gcHJvamVjdCBpcyB0aGUgaG9zdCBwcm9qZWN0LgorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZnJhZ21lbnRQcm9qZWN0cy5hZGQocHJvamVjdCk7CisJCX0KKworCQlpZiAoZnJhZ21lbnRQcm9qZWN0cy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlyZXR1cm4gZnJhZ21lbnRQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7CisJfQorCisJLyoqIAorCSAqIENoZWNrIGlmIHRoZSBnaXZlbiBwbHVnLWluIHByb2plY3QgaXMgYSBmcmFnbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gcGx1Z2luUHJvamVjdCB0aGUgcGx1Zy1pbiBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuCisJICogQHJldHVybiB0cnVlIGlmIGl0IGlzIGEgZnJhZ21lbnQsIG90aGVyd2lzZSBmYWxzZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGcmFnbWVudChJUHJvamVjdCBwbHVnaW5Qcm9qZWN0KSB7CisJCWlmIChwbHVnaW5Qcm9qZWN0ID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJSVBsdWdpbk1vZGVsQmFzZSBwTW9kZWwgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwocGx1Z2luUHJvamVjdCk7CisJCQorCQlpZiAocE1vZGVsID09IG51bGwpIHsKKwkJCS8vIHRoaXMgcHJvamVjdCBpcyBub3QgYSBwbHVnaW4vZnJhZ21lbnQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJcmV0dXJuIHBNb2RlbC5pc0ZyYWdtZW50TW9kZWwoKTsKKwl9CisKKwkvKiogCisJICogR2V0IGFsbCBmcmFnbWVudHMgZm9yIHRoZSBnaXZlbiBob3N0IHByb2plY3QuCisJICogCisJICogQHBhcmFtIGhvc3RQcm9qZWN0IHRoZSBob3N0IHBsdWctaW4gcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLgorCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBmcmFnbWVudCBwcm9qZWN0cyBmb3IgdGhlIGdpdmVuIGhvc3QgcHJvamVjdCB3aGljaCBhcmUgaW4gdGhlIHNhbWUgd29ya3NwYWNlIGFzIHRoZSBob3N0IHByb2plY3QuCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PElQcm9qZWN0PiBnZXRGcmFnbWVudHMoSVByb2plY3QgaG9zdFByb2plY3QpIHsKKwkJLy8gQ2hlY2sgcHJlY29uZGl0aW9ucworCQlTdHJpbmcgaG9zdElkID0gZ2V0UGx1Z2luSWQoaG9zdFByb2plY3QpOworCQlpZiAoaG9zdFByb2plY3QgPT0gbnVsbCB8fCBob3N0SWQgPT0gbnVsbCkgeworCQkJLy8gbm8gdmFsaWQgaG9zdCBwcm9qZWN0IGdpdmVuLgorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQl9CisKKwkJLy8gR2V0IHRoZSBmcmFnbWVudHMgb2YgdGhlIGhvc3QgcHJvamVjdAorCQlJUGx1Z2luTW9kZWxCYXNlIHBNb2RlbEJhc2UgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwoaG9zdFByb2plY3QpOworCQlCdW5kbGVEZXNjcmlwdGlvbiBkZXNjID0gcE1vZGVsQmFzZS5nZXRCdW5kbGVEZXNjcmlwdGlvbigpOworCisJCUFycmF5TGlzdDxJUGx1Z2luTW9kZWxCYXNlPiBmcmFnbWVudE1vZGVscyA9IG5ldyBBcnJheUxpc3Q8SVBsdWdpbk1vZGVsQmFzZT4oKTsKKwkJaWYgKGRlc2MgPT0gbnVsbCkgeworCQkJLy8gVGhlcmUgaXMgbm8gYnVuZGxlIGRlc2NyaXB0aW9uIGZvciB0aGUgaG9zdCBwcm9qZWN0CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX0KKwkJCisJCUJ1bmRsZURlc2NyaXB0aW9uW10gZiA9IGRlc2MuZ2V0RnJhZ21lbnRzKCk7CisJCWZvciAoQnVuZGxlRGVzY3JpcHRpb24gY2FuZGlkYXRlRGVzYyA6IGYpIHsKKwkJCUlQbHVnaW5Nb2RlbEJhc2UgY2FuZGlkYXRlID0gUGx1Z2luUmVnaXN0cnkuZmluZE1vZGVsKGNhbmRpZGF0ZURlc2MpOworCQkJaWYgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIElGcmFnbWVudE1vZGVsKSB7CisJCQkJZnJhZ21lbnRNb2RlbHMuYWRkKGNhbmRpZGF0ZSk7CisJCQl9CisJCX0KKwkJCisJCS8vIEdldCB0aGUgZnJhZ21lbnQgcHJvamVjdCB3aGljaCBpcyBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UKKwkJQXJyYXlMaXN0PElQcm9qZWN0PiBmcmFnbWVudHMgPSBnZXRGcmFnbWVudHNBc1dvcmtzcGFjZVByb2plY3RzKGhvc3RQcm9qZWN0LCBmcmFnbWVudE1vZGVscyk7CisJCQorCQlyZXR1cm4gZnJhZ21lbnRzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZyYWdtZW50LWlkIG9mIHRoZSBwcm9qZWN0IGlmIGl0IGlzIGEgZnJhZ21lbnQgcHJvamVjdCB3aXRoCisJICogdGhlIHNwZWNpZmllZCBob3N0IHBsdWdpbiBpZCBhcyBob3N0LiBFbHNlIG51bGwgaXMgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIHByb2plY3QKKwkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0CisJICogQHBhcmFtIGhvc3RQbHVnaW5JZAorCSAqICAgICAgICAgICAgdGhlIGhvc3QgcGx1Z2luIGlkCisJICogQHJldHVybiB0aGUgcGx1Z2luLWlkIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGcmFnbWVudElkKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBob3N0UGx1Z2luSWQpIHsKKwkJaWYgKCFpc0ZyYWdtZW50KHByb2plY3QpIHx8IGhvc3RQbHVnaW5JZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJSVBsdWdpbk1vZGVsQmFzZSBwbHVnaW5Nb2RlbEJhc2UgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwocHJvamVjdCk7CisJCWlmIChwbHVnaW5Nb2RlbEJhc2UgaW5zdGFuY2VvZiBJRnJhZ21lbnRNb2RlbCkgeworCQkJSUZyYWdtZW50TW9kZWwgZnJhZ21lbnRNb2RlbCA9IChJRnJhZ21lbnRNb2RlbCkgcGx1Z2luTW9kZWxCYXNlOworCQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBmcmFnbWVudE1vZGVsLmdldEJ1bmRsZURlc2NyaXB0aW9uKCk7CisJCQlIb3N0U3BlY2lmaWNhdGlvbiBob3N0U3BlY2lmaWNhdGlvbiA9IGRlc2NyaXB0aW9uLmdldEhvc3QoKTsKKworCQkJaWYgKGhvc3RQbHVnaW5JZC5lcXVhbHMoaG9zdFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkgeworCQkJCXJldHVybiBnZXRQbHVnaW5JZChwcm9qZWN0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBob3N0IHBsdWdpbiBwcm9qZWN0IG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpZiBpdCBjb250YWlucyBhCisJICogZnJhZ21lbnQuCisJICogCisJICogQHBhcmFtIGZyYWdtZW50CisJICogICAgICAgICAgICB0aGUgZnJhZ21lbnQgcHJvamVjdAorCSAqIEByZXR1cm4gdGhlIGhvc3QgcGx1Z2luIHByb2plY3Qgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0RnJhZ21lbnRIb3N0KElQcm9qZWN0IGZyYWdtZW50KSB7CisJCWlmICghaXNGcmFnbWVudChmcmFnbWVudCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlJUGx1Z2luTW9kZWxCYXNlIHBsdWdpbk1vZGVsQmFzZSA9IFBsdWdpblJlZ2lzdHJ5LmZpbmRNb2RlbChmcmFnbWVudCk7CisJCWlmIChwbHVnaW5Nb2RlbEJhc2UgaW5zdGFuY2VvZiBJRnJhZ21lbnRNb2RlbCkgeworCQkJSUZyYWdtZW50TW9kZWwgZnJhZ21lbnRNb2RlbCA9IChJRnJhZ21lbnRNb2RlbCkgcGx1Z2luTW9kZWxCYXNlOworCQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBmcmFnbWVudE1vZGVsLmdldEJ1bmRsZURlc2NyaXB0aW9uKCk7CisJCQlIb3N0U3BlY2lmaWNhdGlvbiBob3N0U3BlY2lmaWNhdGlvbiA9IGRlc2NyaXB0aW9uLmdldEhvc3QoKTsKKwkJCQorCQkJSVBsdWdpbk1vZGVsQmFzZSBob3N0UHJvamVjdCA9IFBsdWdpblJlZ2lzdHJ5LmZpbmRNb2RlbChob3N0U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOworCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGZyYWdtZW50LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOworCQkJQXJyYXlMaXN0PElQcm9qZWN0PiBob3N0UHJvamVjdHMgPSBnZXRQbHVnaW5Qcm9qZWN0cyhBcnJheXMuYXNMaXN0KGhvc3RQcm9qZWN0KSwgcHJvamVjdHMpOworCQkJCisJCQlpZiAoaG9zdFByb2plY3RzLnNpemUoKSAhPSAxKSB7CisJCQkJLy8gaG9zdHByb2plY3Qgbm90IGluIHdvcmtzcGFjZQorCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gaG9zdFByb2plY3RzLmdldCgwKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PElQcm9qZWN0PiBnZXRGcmFnbWVudHNBc1dvcmtzcGFjZVByb2plY3RzKElQcm9qZWN0IGhvc3RQcm9qZWN0LCBBcnJheUxpc3Q8SVBsdWdpbk1vZGVsQmFzZT4gZnJhZ21lbnRNb2RlbHMpIHsKKwkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGhvc3RQcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOworCQkKKwkJQXJyYXlMaXN0PElQcm9qZWN0PiBmcmFnbWVudHMgPSBnZXRQbHVnaW5Qcm9qZWN0cyhmcmFnbWVudE1vZGVscywgcHJvamVjdHMpOworCQkKKwkJcmV0dXJuIGZyYWdtZW50czsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8SVByb2plY3Q+IGdldFBsdWdpblByb2plY3RzKExpc3Q8SVBsdWdpbk1vZGVsQmFzZT4gZnJhZ21lbnRNb2RlbHMsIElQcm9qZWN0W10gcHJvamVjdHMpIHsKKwkJQXJyYXlMaXN0PElQcm9qZWN0PiBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PigpOworCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgeworCQkJSVBsdWdpbk1vZGVsQmFzZSBwTW9kZWwgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwocHJvamVjdCk7CisJCQkKKwkJCWlmIChmcmFnbWVudE1vZGVscy5jb250YWlucyhwTW9kZWwpKSB7CisJCQkJZnJhZ21lbnRzLmFkZChwcm9qZWN0KTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGZyYWdtZW50czsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BsdWdpblByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworCQl0cnkgeworCQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKFBMVUdJTl9OQVRVUkUpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkvL0xvZ2dlci5sb2dFcnJvcihjZSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IubmxzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IubmxzL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggYzYwMzI5MC4uMTQ4ZWIyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLm5scy9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5ubHMvYnVpbGQucHJvcGVydGllcwpAQCAtMSw2ICsxLDUgQEAKIGJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCiAgICAgICAgICAgICAgICBubC8sXAogICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBubC8sXAorc3JjLmluY2x1ZGVzID0gbmwvLFwKICAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMjU4NzBiOC4uYTY1ZTJmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMTYsMTAgKzE2LDEzIEBACiAgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IjMuMi4wIiwKICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZywKICBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcsCi0gb3JnLmVjbGlwc2UucGRlLmNvcmU7YnVuZGxlLXZlcnNpb249IjMuMi4wIiwKICBvcmcuanVuaXQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuYmFiZWwuY29yZQorIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UucGRlLmNvcmU7cmVzb2x1dGlvbjo9b3B0aW9uYWwKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtVmVuZG9yOiAlcGx1Z2luLnByb3ZpZGVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS42CiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IsCisgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmFwaSwKKyBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Iud2l6YXJkcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvYnVpbGQucHJvcGVydGllcwppbmRleCBkNmM4ZGRhLi4xZTk4NTY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvYnVpbGQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvYnVpbGQucHJvcGVydGllcwpAQCAtNywxMCArNyw3IEBACiAgICAgICAgICAgICAgICBiaW4vLFwKICAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBiaW4vLFwKK3NyYy5pbmNsdWRlcyA9IGJpbi8sXAogICAgICAgICAgICAgICAgaWNvbnMvLFwKICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCiAgICAgICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvbWlzc2luZ190cmFuc2xhdGlvbi5naWYgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvbWlzc2luZ190cmFuc2xhdGlvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyNzUwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9taXNzaW5nX3RyYW5zbGF0aW9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvbWlzc2luZ190cmFuc2xhdGlvbi5wbmcgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvbWlzc2luZ190cmFuc2xhdGlvbi5wbmcKaW5kZXggZmQ0MDU1OS4uN2NjNzM5MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL21pc3NpbmdfdHJhbnNsYXRpb24ucG5nCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9taXNzaW5nX3RyYW5zbGF0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvdW51c2VkX2FuZF9taXNzaW5nX3RyYW5zbGF0aW9ucy5wbmcgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvdW51c2VkX2FuZF9taXNzaW5nX3RyYW5zbGF0aW9ucy5wbmcKaW5kZXggMmJjMDNlNi4uMTlhMThiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL3VudXNlZF9hbmRfbWlzc2luZ190cmFuc2xhdGlvbnMucG5nCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy91bnVzZWRfYW5kX21pc3NpbmdfdHJhbnNsYXRpb25zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvdW51c2VkX3RyYW5zbGF0aW9uLnBuZyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy91bnVzZWRfdHJhbnNsYXRpb24ucG5nCmluZGV4IGQ4MzljOTYuLmQ0NDlkMDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy91bnVzZWRfdHJhbnNsYXRpb24ucG5nCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy91bnVzZWRfdHJhbnNsYXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy93YXJuZWRfdHJhbnNsYXRpb24ucG5nIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL3dhcm5lZF90cmFuc2xhdGlvbi5wbmcKaW5kZXggMjUzNDYzNy4uMTcxM2Q5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL3dhcm5lZF90cmFuc2xhdGlvbi5wbmcKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL3dhcm5lZF90cmFuc2xhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcwppbmRleCA1NzNiYTc2Li5iMmVmMDE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMzMsMTAgKzMzLDE2IEBACiBlZGl0b3Iud2l6LmJyb3dzZSAgICAgICAgICAgPSBCcm93c2UuLi4KIGVkaXRvci53aXouYnVuZGxlTmFtZSAgICAgICA9ICZCYXNlIE5hbWU6CiBlZGl0b3Iud2l6LmNyZWF0aW5nICAgICAgICAgPSBDcmVhdGluZworZWRpdG9yLndpei5jcmVhdGVmb2xkZXIgICAgID0gVGhlIGZvbGRlciAiJXMiIGRvZXMgbm90IGV4aXN0LiBEbyB5b3Ugd2FudCB0byBjcmVhdGUgaXQ/CiBlZGl0b3Iud2l6LmRlc2MgICAgICAgICAgICAgPSBUaGlzIHdpemFyZCBjcmVhdGVzIGEgc2V0IG9mIG5ldyBmaWxlcyB3aXRoICoucHJvcGVydGllcyBleHRlbnNpb24gdGhhdCBjYW4gYmUgb3BlbmVkIGJ5IHRoZSBSZXNvdXJjZUJ1bmRsZSBlZGl0b3IuCiBlZGl0b3Iud2l6LmVycm9yLmJ1bmRsZU5hbWUgPSBCYXNlIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCiBlZGl0b3Iud2l6LmVycm9yLmNvbnRhaW5lciAgPSBGaWxlcyBjb250YWluZXIgbXVzdCBiZSBzcGVjaWZpZWQuCitlZGl0b3Iud2l6LmVycm9yLmxvY2FsZSAgICAgPSBBdCBsZWFzdCBvbmUgTG9jYWxlIG11c3QgYmUgYWRkZWQuCiBlZGl0b3Iud2l6LmVycm9yLmV4dGVuc2lvbiAgPSBZb3UgY2FuJ3Qgc3BlY2lmeSBhbiBleHRlbnNpb24uICBJdCB3aWxsIGJlIGFwcGVuZGVkIGZvciB5b3UuCitlZGl0b3Iud2l6LmVycm9yLnByb2plY3Rub3RleGlzdCA9IFByb2plY3QgIiVzIiBkb2VzIG5vdCBleGlzdC4KK2VkaXRvci53aXouZXJyb3IuaW52YWxpZHBhdGggPSBZb3UgaGF2ZSBzcGVjaWZpZWQgYW4gaW52YWxpZCBwYXRoLgorZWRpdG9yLndpei5lcnJvci5jb3VsZG5vdGNyZWF0ZWZvbGRlciA9IEVycm9yIGNyZWF0aW5nIGZvbGRlciAiJXMiLgorZWRpdG9yLndpei5lcnJvci5jb3VsZG5vdGNyZWF0ZWZpbGUgPSBFcnJvciBjcmVhdGluZyBmaWxlICIlcyIuCiBlZGl0b3Iud2l6LmZvbGRlciAgICAgICAgICAgPSAmRm9sZGVyOgogZWRpdG9yLndpei5vcGVuaW5nICAgICAgICAgID0gT3BlbmluZyBwcm9wZXJ0aWVzIGZpbGVzIGZvciBlZGl0aW5nLi4uCiBlZGl0b3Iud2l6LnJlbW92ZSAgICAgICAgICAgPSA8LS0gUmVtb3ZlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9wbHVnaW4ueG1sCmluZGV4IDAxM2Y5YTMuLmVhOGZhOTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9wbHVnaW4ueG1sCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9wbHVnaW4ueG1sCkBAIC00LDggKzQsOCBAQAogICAgPGV4dGVuc2lvbgogICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgogICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvckNvbnRyaWJ1dG9yIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pbnRlcm5hbC5NZXNzYWdlc0VkaXRvciIKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pbnRlcm5hbC5NZXNzYWdlc0VkaXRvckNvbnRyaWJ1dG9yIgogICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKICAgICAgICAgICAgIGV4dGVuc2lvbnM9InByb3BlcnRpZXMiCiAgICAgICAgICAgICBpY29uPSJpY29ucy9wcm9wZXJ0aWVzZmlsZS5naWYiCkBAIC0xNTIsOSArMTUyLDkgQEAKICAgICA8L2NhdGVnb3J5PgogICAgIDx3aXphcmQKICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLndpemFyZHMuUmVzb3VyY2VCdW5kbGUiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci53aXphcmRzLlJlc291cmNlQnVuZGxlV2l6YXJkIgorICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Iud2l6YXJkcy5pbnRlcm5hbC5SZXNvdXJjZUJ1bmRsZVdpemFyZCIKICAgICAgICAgICBpY29uPSJpY29ucy9yZXNvdXJjZWJ1bmRsZS5naWYiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci53aXphcmRzLlJlc291cmNlQnVuZGxlV2l6YXJkIgorICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Iud2l6YXJkcy5pbnRlcm5hbC5SZXNvdXJjZUJ1bmRsZVdpemFyZCIKICAgICAgICAgICBuYW1lPSIld2l6YXJkLnJiLnRpdGxlIj4KICAgICAgICA8ZGVzY3JpcHRpb24+CiAgICAgICAgICAgJXdpemFyZC5yYi5kZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvSU1lc3NhZ2VzRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9JTWVzc2FnZXNFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvSU1lc3NhZ2VzRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBNYXR0aGlhcyBMZXR0bWF5ZXIuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWF0dGhpYXMgTGV0dG1heWVyIC0gY3JlYXRlZCBpbnRlcmZhY2UgdG8gc2VsZWN0IGEga2V5IGluIGFuIGVkaXRvciAoZml4ZWQgaXNzdWUgNTkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3I7CisKK3B1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VzRWRpdG9yIHsKKwlTdHJpbmcgZ2V0U2VsZWN0ZWRLZXkoKTsKKworCXZvaWQgc2V0U2VsZWN0ZWRLZXkoU3RyaW5nIGtleSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9JTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIuamF2YQppbmRleCAzMTI1NDJmLi5kNDFhMGYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9JTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL0lNZXNzYWdlc0VkaXRvckNoYW5nZUxpc3RlbmVyLmphdmEKQEAgLTEwLDcgKzEwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvcjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLkFic3RyYWN0S2V5VHJlZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsLkFic3RyYWN0S2V5VHJlZU1vZGVsOwogCiAKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvTWVzc2FnZXNFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL01lc3NhZ2VzRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzBiOGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvTWVzc2FnZXNFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFBhc2NhbCBFc3NpZW1icmUuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5JTWVzc2FnZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5BYnN0cmFjdEtleVRyZWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuYnVpbGRlci5Ub2dnbGVOYXR1cmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmJ1bmRsZS5NZXNzYWdlc0J1bmRsZUdyb3VwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaTE4bi5JMThOUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wcmVmZXJlbmNlcy5Nc2dFZGl0b3JQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmVzb3VyY2UuRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci52aWV3cy5NZXNzYWdlc0J1bmRsZUdyb3VwT3V0bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci0KLS8qKgotICogTXVsdGktcGFnZSBlZGl0b3IgZm9yIGVkaXRpbmcgcmVzb3VyY2UgYnVuZGxlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzRWRpdG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAotICAgICAgICBpbXBsZW1lbnRzIElHb3RvTWFya2VyIHsKLQotICAgIC8qKiBFZGl0b3IgSUQsIGFzIGRlZmluZWQgaW4gcGx1Z2luLnhtbC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSAKLSAgICAgICAib3JnLmVjbGlscHNlLmJhYmVsLmVkaXRvci5lZGl0b3IuTWVzc2FnZXNFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFN0cmluZyBzZWxlY3RlZEtleTsKLSAgICBwcml2YXRlIExpc3Q8SU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI+KDIpOwotICAgIAotICAgIC8qKiBNZXNzYWdlc0J1bmRsZSBncm91cC4gKi8KLSAgICBwcml2YXRlIE1lc3NhZ2VzQnVuZGxlR3JvdXAgbWVzc2FnZXNCdW5kbGVHcm91cDsKLQotICAgIC8qKiBQYWdlIHdpdGgga2V5IHRyZWUgYW5kIHRleHQgZmllbGRzIGZvciBhbGwgbG9jYWxlcy4gKi8KLSAgICBwcml2YXRlIEkxOE5QYWdlIGkxOG5QYWdlOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxMb2NhbGU+IGxvY2FsZXNJbmRleCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxlPigpOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxJVGV4dEVkaXRvcj4gdGV4dEVkaXRvcnNJbmRleCA9IG5ldyBBcnJheUxpc3Q8SVRleHRFZGl0b3I+KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBNZXNzYWdlc0J1bmRsZUdyb3VwT3V0bGluZSBvdXRsaW5lOwotICAgIAotICAgIHByaXZhdGUgTWVzc2FnZXNFZGl0b3JNYXJrZXJzIG1hcmtlcnM7Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSBBYnN0cmFjdEtleVRyZWVNb2RlbCBrZXlUcmVlTW9kZWw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG11bHRpLXBhZ2UgZWRpdG9yIGV4YW1wbGUuCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VzRWRpdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBvdXRsaW5lID0gbmV3IE1lc3NhZ2VzQnVuZGxlR3JvdXBPdXRsaW5lKHRoaXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZXNFZGl0b3JNYXJrZXJzIGdldE1hcmtlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtYXJrZXJzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VMaXN0ZW5lcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+TXVsdGlQYWdlRWRpdG9yRXhhbXBsZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QKLSAgICAgKiBjaGVja3MgdGhhdCB0aGUgaW5wdXQgaXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SUZpbGVFZGl0b3JJbnB1dDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpCi0gICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgCQotICAgIAlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgaWYgKE1zZ0VkaXRvclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuaXNCdWlsZGVyU2V0dXBBdXRvbWF0aWNhbGx5KCkpIHsKLQkgICAgICAgICAgICBJUHJvamVjdCBwID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBwLmlzQWNjZXNzaWJsZSgpKSB7Ci0JICAgICAgICAgICAgCVRvZ2dsZU5hdHVyZUFjdGlvbi5hZGRPclJlbW92ZU5hdHVyZU9uUHJvamVjdChwLCB0cnVlLCB0cnVlKTsKLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VzQnVuZGxlR3JvdXAgPSBNZXNzYWdlc0J1bmRsZUdyb3VwRmFjdG9yeS5jcmVhdGVCdW5kbGVHcm91cChzaXRlLCBmaWxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGJ1bmRsZSBncm91cC4iLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFya2VycyA9IG5ldyBNZXNzYWdlc0VkaXRvck1hcmtlcnMobWVzc2FnZXNCdW5kbGVHcm91cCk7Ci0gICAgICAgICAgICBzZXRQYXJ0TmFtZShtZXNzYWdlc0J1bmRsZUdyb3VwLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzZXRUaXRsZUltYWdlKFVJVXRpbHMuZ2V0SW1hZ2UoVUlVdGlscy5JTUFHRV9SRVNPVVJDRV9CVU5ETEUpKTsKLSAgICAgICAgICAgIGNsb3NlSWZBcmVhZHlPcGVuKHNpdGUsIGZpbGUpOwotICAgICAgICAgICAgc3VwZXIuaW5pdChzaXRlLCBlZGl0b3JJbnB1dCk7Ci0gICAgICAgICAgICAvL1RPRE8gZmlndXJlIG91dCBtb2RlbCB0byB1c2UgYmFzZWQgb24gcHJlZmVyZW5jZXMKLSAgICAgICAgICAgIGtleVRyZWVNb2RlbCA9IG5ldyBBYnN0cmFjdEtleVRyZWVNb2RlbChtZXNzYWdlc0J1bmRsZUdyb3VwKTsKLS8vICAgICAgICAgICAgbWFya2VyTWFuYWdlciA9IG5ldyBSQkVNYXJrZXJNYW5hZ2VyKHRoaXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBJRmlsZUVkaXRvcklucHV0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotLy8gICAgcHVibGljIFJCRU1hcmtlck1hbmFnZXIgZ2V0TWFya2VyTWFuYWdlcigpIHsKLS8vICAgICAgICByZXR1cm4gbWFya2VyTWFuYWdlcjsKLS8vICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBJMThOIHBhZ2UKLSAgICAgICAgaTE4blBhZ2UgPSBuZXcgSTE4TlBhZ2UoCi0gICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCksIFNXVC5OT05FLCB0aGlzKTsKLSAgICAgICAgaW50IGluZGV4ID0gYWRkUGFnZShpMThuUGFnZSk7Ci0gICAgICAgIHNldFBhZ2VUZXh0KGluZGV4LCBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgImVkaXRvci5wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFBhZ2VJbWFnZShpbmRleCwgVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX1JFU09VUkNFX0JVTkRMRSkpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRleHQgZWRpdG9yIHBhZ2VzIGZvciBlYWNoIGxvY2FsZXMKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvY2FsZVtdIGxvY2FsZXMgPSBtZXNzYWdlc0J1bmRsZUdyb3VwLmdldExvY2FsZXMoKTsKLSAgICAgICAgICAgIC8vZmlyc3Q6IHNvcnQgdGhlIGxvY2FsZXMuCi0gICAgICAgICAgICBVSVV0aWxzLnNvcnRMb2NhbGVzKGxvY2FsZXMpOwotICAgICAgICAgICAgLy9zZWNvbmQ6IGZpbHRlcitzb3J0IHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBmaWx0ZXIgcHJlZmVyZW5jZXMuCi0gICAgICAgICAgICBsb2NhbGVzID0gVUlVdGlscy5maWx0ZXJMb2NhbGVzKGxvY2FsZXMpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAJTG9jYWxlIGxvY2FsZSA9IGxvY2FsZXNbaV07Ci0gICAgICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUgPSBtZXNzYWdlc0J1bmRsZUdyb3VwLmdldE1lc3NhZ2VzQnVuZGxlKGxvY2FsZSk7Ci0gICAgICAgICAgICAgICAgSU1lc3NhZ2VzUmVzb3VyY2UgcmVzb3VyY2UgPSBtZXNzYWdlc0J1bmRsZS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgIFRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChUZXh0RWRpdG9yKSByZXNvdXJjZS5nZXRTb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGFkZFBhZ2UodGV4dEVkaXRvciwgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgICAgICBzZXRQYWdlVGV4dChpbmRleCwgVUlVdGlscy5nZXREaXNwbGF5TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzQnVuZGxlLmdldExvY2FsZSgpKSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUltYWdlKGluZGV4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFVJVXRpbHMuZ2V0SW1hZ2UoVUlVdGlscy5JTUFHRV9QUk9QRVJUSUVTX0ZJTEUpKTsKLSAgICAgICAgICAgICAgICBsb2NhbGVzSW5kZXguYWRkKGxvY2FsZSk7Ci0gICAgICAgICAgICAgICAgdGV4dEVkaXRvcnNJbmRleC5hZGQodGV4dEVkaXRvcik7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2l0ZSgpLmdldFNoZWxsKCksIAotICAgICAgICAgICAgICAgICJFcnJvciBjcmVhdGluZyB0ZXh0IGVkaXRvciBwYWdlLiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBudWxsLCBlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWRpdG9yJ3MgcGFnZXMgbmVlZCB0byBiZSByZWxvYWRlZC4KLSAgICAgKiBGb3IgZXhhbXBsZSB3aGVuIHRoZSBmaWx0ZXJzIG9mIGxvY2FsZSBpcyBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIEN1cnJlbnRseSB0aGlzIG9ubHkgcmVsb2FkcyB0aGUgaW5kZXggcGFnZS4KLSAgICAgKiBUT0RPOiByZW1vdmUgYW5kIGFkZCB0aGUgbmV3IGxvY2FsZXM/IGl0IGFjdHVhbGx5IGxvb2tzIHF1aXRlIGhhcmQgdG8gZG8uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbG9hZERpc3BsYXllZENvbnRlbnRzKCkgewotICAgIAlzdXBlci5yZW1vdmVQYWdlKDApOwotICAgIAlpbnQgY3VycmVudGx5QWN0aXZlUGFnZSA9IHN1cGVyLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAJaTE4blBhZ2UuZGlzcG9zZSgpOwotICAgIAlpMThuUGFnZSA9IG5ldyBJMThOUGFnZSgKLSAgICAgICAgICAgICAgICBnZXRDb250YWluZXIoKSwgU1dULk5PTkUsIHRoaXMpOwotICAgIAlzdXBlci5hZGRQYWdlKDAsIGkxOG5QYWdlKTsKLSAgICAJaWYgKGN1cnJlbnRseUFjdGl2ZVBhZ2UgPT0gMCkgewotICAgIAkJc3VwZXIuc2V0QWN0aXZlUGFnZShjdXJyZW50bHlBY3RpdmVQYWdlKTsKLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBtdWx0aS1wYWdlIGVkaXRvcidzIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgZm9yIChJVGV4dEVkaXRvciB0ZXh0RWRpdG9yIDogdGV4dEVkaXRvcnNJbmRleCkgewotICAgICAgICAgICAgdGV4dEVkaXRvci5kb1NhdmUobW9uaXRvcik7Ci0gICAgICAgIH0KLS8vICAgICAgICBpMThuUGFnZS5yZWZyZXNoRWRpdG9yT25DaGFuZ2VzKCk7Ci0vLyAgICAgICAgcmVzb3VyY2VNZWRpYXRvci5zYXZlKG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotICAgICAgICAvLyBTYXZlIEFzIG5vdCBhbGxvd2VkLgotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2UgY3VycmVudCBwYWdlIGJhc2VkIG9uIGxvY2FsZS4gIElmIHRoZXJlIGlzIG5vIGVkaXRvcnMgYXNzb2NpYXRlZAotICAgICAqIHdpdGggY3VycmVudCBsb2NhbGUsIGRvIG5vdGhpbmcuCi0gICAgICogQHBhcmFtIGxvY2FsZSBsb2NhbGUgdXNlZCB0byBpZGVudGlmeSB0aGUgcGFnZSB0byBjaGFuZ2UgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gbG9jYWxlc0luZGV4LmluZGV4T2YobG9jYWxlKTsKLSAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIHNldEFjdGl2ZVBhZ2UoaW5kZXggKyAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyI2dvdG9NYXJrZXIoCi0gICAgICogICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLS8vICAgICAgICBTdHJpbmcga2V5ID0gbWFya2VyLmdldEF0dHJpYnV0ZShSQkVNYXJrZXIuS0VZLCAiIik7Ci0vLyAgICAgICAgaWYgKGtleSAhPSBudWxsICYmIGtleS5sZW5ndGgoKSA+IDApIHsKLS8vICAgICAgICAgICAgc2V0QWN0aXZlUGFnZSgwKTsKLS8vICAgICAgICAgICAgc2V0U2VsZWN0ZWRLZXkoa2V5KTsKLS8vICAgICAgICAgICAgZ2V0STE4TlBhZ2UoKS5zZWxlY3RMb2NhbGUoQmFiZWxVdGlscy5wYXJzZUxvY2FsZSgKLS8vICAgICAgICAgICAgICAgICAgICBtYXJrZXIuZ2V0QXR0cmlidXRlKFJCRU1hcmtlci5MT0NBTEUsICIiKSkpOwotLy8gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIExvY2FsZVtdIGxvY2FsZXMgPSBtZXNzYWdlc0J1bmRsZUdyb3VwLmdldExvY2FsZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZXNzYWdlc1Jlc291cmNlIG1lc3NhZ2VzUmVzb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNCdW5kbGVHcm91cC5nZXRNZXNzYWdlc0J1bmRsZShsb2NhbGVzW2ldKS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc1Jlc291cmNlIGluc3RhbmNlb2YgRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBFY2xpcHNlUHJvcGVydGllc0VkaXRvclJlc291cmNlIHByb3BGaWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZSkgbWVzc2FnZXNSZXNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmVxdWFscyhwcm9wRmlsZS5nZXRSZXNvdXJjZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAJLy9vayB3ZSBnb3QgdGhlIGxvY2FsZS4KLSAgICAgICAgICAgICAgICAgICAgCS8vdHJ5IHRvIG9wZW4gdGhlIG1hc3RlciBpMThuIHBhZ2UgYW5kIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBrZXkuCi0gICAgICAgICAgICAgICAgICAgIAl0cnkgewotCSAgICAgICAgICAgICAgICAgICAgCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04pOwotCSAgICAgICAgICAgICAgICAgICAgCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkubGVuZ3RoKCkgPiAwKSB7Ci0JICAgICAgICAgICAgICAgICAgICAJCWdldEkxOE5QYWdlKCkuc2VsZWN0TG9jYWxlKGxvY2FsZXNbaV0pOwotCSAgICAgICAgICAgICAgICAgICAgCQlzZXRBY3RpdmVQYWdlKDApOwotCSAgICAgICAgICAgICAgICAgICAgCQlzZXRTZWxlY3RlZEtleShrZXkpOwotCSAgICAgICAgICAgICAgICAgICAgCQlyZXR1cm47Ci0JICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOy8vc29tZXRoaW5nIGJldHRlci5zCi0gICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIAkvL2l0IGRpZCBub3Qgd29yay4uLiBmYWxsIGJhY2sgdG8gdGhlIHRleHQgZWRpdG9yLgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlUGFnZShsb2NhbGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElERS5nb3RvTWFya2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUVkaXRvclBhcnQpIHByb3BGaWxlLmdldFNvdXJjZSgpLCBtYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxjdWxhdGVzIHRoZSBjb250ZW50cyBvZiBwYWdlIEdVSSBwYWdlIHdoZW4gaXQgaXMgYWN0aXZhdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotICAgICAgICBzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0vLyAgICAgICAgaWYgKG5ld1BhZ2VJbmRleCA9PSAwKSB7Ci0vLyAgICAgICAgICAgIHJlc291cmNlTWVkaWF0b3IucmVsb2FkUHJvcGVydGllcygpOwotLy8gICAgICAgICAgICBpMThuUGFnZS5yZWZyZXNoVGV4dEJveGVzKCk7Ci0vLyAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIElzIHRoZSBnaXZlbiBmaWxlIGEgbWVtYmVyIG9mIHRoaXMgcmVzb3VyY2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBmaWxlIGZpbGUgdG8gdGVzdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlsZSBpcyBwYXJ0IG9mIGJ1bmRsZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQnVuZGxlTWVtYmVyKElGaWxlIGZpbGUpIHsKLS8vICAgICAgICByZXR1cm4gcmVzb3VyY2VNZWRpYXRvci5pc1Jlc291cmNlKGZpbGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlSWZBcmVhZHlPcGVuKElFZGl0b3JTaXRlIHNpdGUsIElGaWxlIGZpbGUpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHBhZ2VzW2ldOwotICAgICAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvcnMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZWRpdG9ycy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGVkaXRvcnNbal0uZ2V0RWRpdG9yKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWVzc2FnZXNFZGl0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXNFZGl0b3IgcmJlID0gKE1lc3NhZ2VzRWRpdG9yKSBlZGl0b3I7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYmUuaXNCdW5kbGVNZW1iZXIoZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgZm9yIChJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotICAgICAgICAgICAgbGlzdGVuZXIuZWRpdG9yRGlzcG9zZWQoKTsKLSAgICAgICAgfQotICAgICAgICBpMThuUGFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIGZvciAoSVRleHRFZGl0b3IgdGV4dEVkaXRvciA6IHRleHRFZGl0b3JzSW5kZXgpIHsKLSAgICAgICAgICAgIHRleHRFZGl0b3IuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGVkS2V5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRLZXkoKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3RlZEtleTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHNlbGVjdGVkS2V5IFRoZSBzZWxlY3RlZEtleSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRLZXkoU3RyaW5nIGFjdGl2ZUtleSkgewotICAgICAgICBpZiAoKHNlbGVjdGVkS2V5ID09IG51bGwgJiYgYWN0aXZlS2V5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKHNlbGVjdGVkS2V5ICE9IG51bGwgJiYgYWN0aXZlS2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKHNlbGVjdGVkS2V5ICE9IG51bGwgJiYgIXNlbGVjdGVkS2V5LmVxdWFscyhhY3RpdmVLZXkpKSkgewotICAgICAgICAgICAgU3RyaW5nIG9sZEtleSA9IHRoaXMuc2VsZWN0ZWRLZXk7Ci0gICAgICAgICAgICB0aGlzLnNlbGVjdGVkS2V5ID0gYWN0aXZlS2V5OwotICAgICAgICAgICAgZm9yIChJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlbGVjdGVkS2V5Q2hhbmdlZChvbGRLZXksIGFjdGl2ZUtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBjaGFuZ2VMaXN0ZW5lcnMuYWRkKDAsIGxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgY2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb2xsZWN0aW9uPElNZXNzYWdlc0VkaXRvckNoYW5nZUxpc3RlbmVyPiBnZXRDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0gICAgICAgIHJldHVybiBjaGFuZ2VMaXN0ZW5lcnM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWVzc2FnZXNCdW5kbGVHcm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZXNCdW5kbGVHcm91cCBnZXRCdW5kbGVHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VzQnVuZGxlR3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXlUcmVlTW9kZWwuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0S2V5VHJlZU1vZGVsIGdldEtleVRyZWVNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIGtleVRyZWVNb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ga2V5VHJlZU1vZGVsIFRoZSBrZXlUcmVlTW9kZWwgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEtleVRyZWVNb2RlbChBYnN0cmFjdEtleVRyZWVNb2RlbCBuZXdLZXlUcmVlTW9kZWwpIHsKLSAgICAgICAgaWYgKCh0aGlzLmtleVRyZWVNb2RlbCA9PSBudWxsICYmIG5ld0tleVRyZWVNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChrZXlUcmVlTW9kZWwgIT0gbnVsbCAmJiBuZXdLZXlUcmVlTW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB8fCAoIWtleVRyZWVNb2RlbC5lcXVhbHMobmV3S2V5VHJlZU1vZGVsKSkpIHsKLSAgICAgICAgCUFic3RyYWN0S2V5VHJlZU1vZGVsIG9sZE1vZGVsID0gdGhpcy5rZXlUcmVlTW9kZWw7Ci0gICAgICAgICAgICB0aGlzLmtleVRyZWVNb2RlbCA9IG5ld0tleVRyZWVNb2RlbDsKLSAgICAgICAgICAgIGZvciAoSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgIAlsaXN0ZW5lci5rZXlUcmVlTW9kZWxDaGFuZ2VkKG9sZE1vZGVsLCBuZXdLZXlUcmVlTW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEkxOE5QYWdlIGdldEkxOE5QYWdlKCkgewotICAgICAgICByZXR1cm4gaTE4blBhZ2U7Ci0gICAgfQotICAgIAotICAgIC8qKiBvbmUgb2YgdGhlIFNIT1dfKiBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUge0BsaW5rIElNZXNzYWdlc0VkaXRvckNoYW5nZUxpc3RlbmVyfSAqLyAgICAKLSAgICBwcml2YXRlIGludCBzaG93T25seU1pc3NpbmdBbmRVbnVzZWRLZXlzID0gSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIuU0hPV19BTEw7Ci0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gb25seSB1bnVzZWQgYW5kIG1pc3Npbmcga2V5cyBzaG91bGQgYmUgZGlzcGxheWVkLiBmbGFzZSBieSBkZWZhdWx0LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaXNTaG93T25seVVudXNlZEFuZE1pc3NpbmdLZXlzKCkgewotICAgICAgICByZXR1cm4gc2hvd09ubHlNaXNzaW5nQW5kVW51c2VkS2V5czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U2hvd09ubHlVbnVzZWRNaXNzaW5nS2V5cyhpbnQgc2hvd0ZsYWcpIHsKLSAgICAgICAgc2hvd09ubHlNaXNzaW5nQW5kVW51c2VkS2V5cyA9IHNob3dGbGFnOwotICAgICAgICBmb3IgKElNZXNzYWdlc0VkaXRvckNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogZ2V0Q2hhbmdlTGlzdGVuZXJzKCkpIHsKLSAgICAgICAgCWxpc3RlbmVyLnNob3dPbmx5VW51c2VkQW5kTWlzc2luZ0NoYW5nZWQoc2hvd0ZsYWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChvdXRsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIElUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICBpbnQgaW5kZXggPSBsb2NhbGVzSW5kZXguaW5kZXhPZihsb2NhbGUpOwotICAgICAgICByZXR1cm4gdGV4dEVkaXRvcnNJbmRleC5nZXQoaW5kZXgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FjdGlvbnMvRmlsdGVyS2V5c0FjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYWN0aW9ucy9GaWx0ZXJLZXlzQWN0aW9uLmphdmEKaW5kZXggZmM3YmVhNy4uMjEyNWUzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYWN0aW9ucy9GaWx0ZXJLZXlzQWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYWN0aW9ucy9GaWx0ZXJLZXlzQWN0aW9uLmphdmEKQEAgLTExLDEyICsxMSwxNCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuYWN0aW9uczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5JTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3JDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3JDb250cmlidXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKIAogLyoqCiAgKiAKQEAgLTczLDExICs3NSwyNyBAQAogICAgIAl9CiAJCXNldFRleHQoZ2V0VGV4dEludGVybmFsKCkpOwogCQlzZXRUb29sVGlwVGV4dChnZXRUb29sdGlwSW50ZXJuYWwoKSk7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihVSVV0aWxzLmdldEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZUtleSgpKSk7CisgICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUltYWdlKGdldEltYWdlKCkpKTsKIAogICAgIH0KICAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEltYWdlS2V5KCkgeworICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKyAgICAJc3dpdGNoIChmbGFnVG9TZXQpIHsKKyAgICAJY2FzZSBJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lci5TSE9XX09OTFlfTUlTU0lORzoKKyAgICAJCS8vcmV0dXJuIFVJVXRpbHMuSU1BR0VfTUlTU0lOR19UUkFOU0xBVElPTjsKKyAgICAJCXJldHVybiBVSVV0aWxzLmdldE1pc3NpbmdUcmFuc2xhdGlvbkltYWdlKCk7CisgICAgCWNhc2UgSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIuU0hPV19PTkxZX01JU1NJTkdfQU5EX1VOVVNFRDoKKyAgICAJCS8vcmV0dXJuIFVJVXRpbHMuSU1BR0VfVU5VU0VEX0FORF9NSVNTSU5HX1RSQU5TTEFUSU9OUzsKKyAgICAJCXJldHVybiBVSVV0aWxzLmdldE1pc3NpbmdBbmRVbnVzZWRUcmFuc2xhdGlvbnNJbWFnZSgpOworICAgIAljYXNlIElNZXNzYWdlc0VkaXRvckNoYW5nZUxpc3RlbmVyLlNIT1dfT05MWV9VTlVTRUQ6CisgICAgCQkvL3JldHVybiBVSVV0aWxzLklNQUdFX1VOVVNFRF9UUkFOU0xBVElPTjsKKyAgICAJCXJldHVybiBVSVV0aWxzLmdldFVudXNlZFRyYW5zbGF0aW9uc0ltYWdlKCk7CisgICAgCWNhc2UgSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIuU0hPV19BTEw6CisgICAgCWRlZmF1bHQ6CisgICAgCQlyZXR1cm4gVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX0tFWSk7IAorICAgIAl9CisgICAgfQorICAgIC8qcHVibGljIFN0cmluZyBnZXRJbWFnZUtleSgpIHsKICAgICAJc3dpdGNoIChmbGFnVG9TZXQpIHsKICAgICAJY2FzZSBJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lci5TSE9XX09OTFlfTUlTU0lORzoKICAgICAJCXJldHVybiBVSVV0aWxzLklNQUdFX01JU1NJTkdfVFJBTlNMQVRJT047CkBAIC04OSw3ICsxMDcsNyBAQAogICAgIAlkZWZhdWx0OgogICAgIAkJcmV0dXJuIFVJVXRpbHMuSU1BR0VfS0VZOyAKICAgICAJfQotICAgIH0KKyAgICB9Ki8KICAgICAKICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRJbnRlcm5hbCgpIHsKICAgICAJc3dpdGNoIChmbGFnVG9TZXQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FjdGlvbnMvS2V5VHJlZVZpc2libGVBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FjdGlvbnMvS2V5VHJlZVZpc2libGVBY3Rpb24uamF2YQppbmRleCBlNWM2MjRiLi44ODUzYTgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9hY3Rpb25zL0tleVRyZWVWaXNpYmxlQWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYWN0aW9ucy9LZXlUcmVlVmlzaWJsZUFjdGlvbi5qYXZhCkBAIC0xMCw4ICsxMCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuYWN0aW9uczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3JDaGFuZ2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pbnRlcm5hbC5NZXNzYWdlc0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3JDaGFuZ2VBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci51dGlsLlVJVXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FjdGlvbnMvTmV3TG9jYWxlQWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9hY3Rpb25zL05ld0xvY2FsZUFjdGlvbi5qYXZhCmluZGV4IDBmOTJjOWEuLmE5MzU1NTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FjdGlvbnMvTmV3TG9jYWxlQWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYWN0aW9ucy9OZXdMb2NhbGVBY3Rpb24uamF2YQpAQCAtNywxMiArNywyMSBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIE1hdHRoaWFzIExldHRtYXllciAtIGltcGxlbWVudGVkIGFjdGlvbiBhbmQgY3JlYXRlZCBkaWFsb2cKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5hY3Rpb25zOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnV0aWwuVUlVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Iud2lkZ2V0cy5Mb2NhbGVTZWxlY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwogCiAvKioKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZQpAQCAtMjcsMTIgKzM2LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgTmV3TG9jYWxlQWN0aW9uKCkgewogICAgICAgICBzdXBlcigiTmV3ICZMb2NhbGUuLi4iKTsKLS8vICAgICAgICBzZXRUZXh0KCk7CiAgICAgICAgIHNldFRvb2xUaXBUZXh0KCJBZGQgYSBuZXcgbG9jYWxlIHRvIHRoZSByZXNvdXJjZSBidW5kbGUuIik7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihVSVV0aWxzLmdldEltYWdlRGVzY3JpcHRvcihVSVV0aWxzLklNQUdFX05FV19QUk9QRVJUSUVTX0ZJTEUpKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKKyAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFVJVXRpbHMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVJVXRpbHMuSU1BR0VfTkVXX1BST1BFUlRJRVNfRklMRSkpOyAgICAgICAgIAogICAgIH0KIAogICAgIC8vVE9ETyBSQkVkaXRvciBob2xkIHN1Y2ggYW4gYWN0aW9uIHJlZ2lzdHJ5LiAgVGhlbiBtb3ZlIHRoaXMgbWV0aG9kIHRvIGNvbnN0cnVjdG9yCkBAIC00NCw3ICs0OSw1MSBAQAogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAJLy8gY3JlYXRlZCBjaG9vc2UgbG9jYWxlIGRpYWxvZworICAgIAlEaWFsb2cgbG9jYWxlRGlhbG9nID0gbmV3IERpYWxvZyhlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpIHsgICAgCQkKKyAgICAJCUxvY2FsZVNlbGVjdG9yIHNlbGVjdG9yOworICAgIAkJCisgICAgCQlAT3ZlcnJpZGUKKyAgICAJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7CisgICAgCQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOworICAgIAkJCW5ld1NoZWxsLnNldFRleHQoIkFkZCBuZXcgbG9jYWwiKTsKKyAgICAJCX0KKyAgICAJCQorICAgIAkJQE92ZXJyaWRlCisgICAgCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAJCQlDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKyAgICAJCQlzZWxlY3RvciA9IG5ldyBMb2NhbGVTZWxlY3Rvcihjb21wKTsKKyAgICAJCQlyZXR1cm4gY29tcDsKKyAgICAJCX0KKyAgICAJCQorICAgIAkJQE92ZXJyaWRlCisgICAgCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisgICAgCQkJLy8gYWRkIGxvY2FsIHRvIGJ1bmRsZUdyb3VwCisgICAgCSAgICAJTWVzc2FnZXNCdW5kbGVHcm91cCBidW5kbGVHcm91cCA9IGVkaXRvci5nZXRCdW5kbGVHcm91cCgpOyAgCisgICAgCSAgICAJTG9jYWxlIG5ld0xvY2FsID0gc2VsZWN0b3IuZ2V0U2VsZWN0ZWRMb2NhbGUoKTsKKyAgICAJICAgIAkKKyAgICAJICAgIAkvLyBleGlzdHMgbG9jYWwgYWxyZWFkeT8KKyAgICAJICAgIAlib29sZWFuIGV4aXN0c0xvY2FsID0gZmFsc2U7CisgICAgCSAgICAJTG9jYWxlW10gbG9jYWxlcyA9IGJ1bmRsZUdyb3VwLmdldExvY2FsZXMoKTsKKyAgICAJICAgIAlmb3IgKExvY2FsZSBsb2NhbGUgOiBsb2NhbGVzKSB7CisgICAgCSAgICAJCWlmIChsb2NhbGUgPT0gbnVsbCkgeworICAgIAkgICAgCQkJaWYgKG5ld0xvY2FsID09IG51bGwpIHsKKyAgICAJICAgIAkJCQlleGlzdHNMb2NhbCA9IHRydWU7CisgICAgCSAgICAJCQkJYnJlYWs7CisgICAgCSAgICAJCQl9CisgICAgCSAgICAJCX0gZWxzZSBpZiAobG9jYWxlLmVxdWFscyhuZXdMb2NhbCkpIHsKKyAgICAJICAgIAkJCWV4aXN0c0xvY2FsID0gdHJ1ZTsKKyAgICAJICAgIAkJCWJyZWFrOworICAgIAkgICAgCQl9ICAgIAkgICAgCQkJCisgICAgCSAgICAJfQorICAgIAkgICAgCQorICAgIAkgICAgCWlmICghIGV4aXN0c0xvY2FsKQorICAgIAkgICAgCQlidW5kbGVHcm91cC5hZGRNZXNzYWdlc0J1bmRsZShuZXdMb2NhbCk7CisgICAgCSAgICAJCisgICAgCQkJc3VwZXIub2tQcmVzc2VkKCk7CisgICAgCQl9CisJCX07CisJCS8vIG9wZW4gZGlhbG9nCisgICAgCWxvY2FsZURpYWxvZy5vcGVuKCk7ICAgIAkKICAgICB9Ci0gICAgCi0gICAgCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9hcGkvQW5hbHl6ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9hcGkvQW5hbHl6ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNGQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FwaS9BbmFseXplckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFsZXhlaiBTdHJlbHpvdy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBBbGV4ZWogU3RyZWx6b3cgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5hcGk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLnByb3hpbWl0eS5JUHJveGltaXR5QW5hbHl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5wcm94aW1pdHkuTGV2ZW5zaHRlaW5EaXN0YW5jZUFuYWx5emVyOworCisvKioKKyAqIFByb3ZpZGVzIHRoZSB7QGxpbmsgSVByb3hpbWl0eUFuYWx5emVyfQorICogPGJyPjxicj4KKyAqIAorICogQGF1dGhvciBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGNsYXNzIEFuYWx5emVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgTGV2ZW5zaHRlaW5EaXN0YW5jZUFuYWx5emVyfQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVByb3hpbWl0eUFuYWx5emVyIGdldExldmVuc2h0ZWluRGlzdGFuY2VBbmFseXplciAoKSB7CisJCXJldHVybiAoSVByb3hpbWl0eUFuYWx5emVyKSBMZXZlbnNodGVpbkRpc3RhbmNlQW5hbHl6ZXIuZ2V0SW5zdGFuY2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9hcGkvRWRpdG9yVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYXBpL0VkaXRvclV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDBmNGIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYXBpL0VkaXRvclV0aWwuamF2YQpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5hcGk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmkxOG4uSTE4TlBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOworCisvKioKKyAqIFV0aWwgY2xhc3MgZm9yIGVkaXRvciBvcGVyYXRpb25zLgorICogPGJyPjxicj4KKyAqIAorICogQGF1dGhvciBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGNsYXNzIEVkaXRvclV0aWwgeworCQorCS8qKgorCSAqIEBwYXJhbSBwYWdlIFRoZSB7QGxpbmsgSVdvcmtiZW5jaFBhZ2V9CisJICogQHJldHVybiBUaGUgc2VsZWN0ZWQge0BsaW5rIElLZXlUcmVlTm9kZX0gb2YgdGhlIHBhZ2UuCisJICovCisgICAgcHVibGljIHN0YXRpYyBJS2V5VHJlZU5vZGUgZ2V0U2VsZWN0ZWRLZXlUcmVlTm9kZSAoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgeworICAgICAgICBNZXNzYWdlc0VkaXRvciBlZGl0b3IgPSAoTWVzc2FnZXNFZGl0b3IpcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKKyAgICAgICAgaWYgKGVkaXRvci5nZXRTZWxlY3RlZFBhZ2UoKSBpbnN0YW5jZW9mIEkxOE5QYWdlKSB7CisgICAgICAgICAgICBJMThOUGFnZSBwID0gKEkxOE5QYWdlKSBlZGl0b3IuZ2V0U2VsZWN0ZWRQYWdlKCk7CisgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHAuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKElLZXlUcmVlTm9kZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9hcGkvSVZhbHVlZEtleVRyZWVOb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9hcGkvSVZhbHVlZEtleVRyZWVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlNTNmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FwaS9JVmFsdWVkS2V5VHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBSZWl0ZXJlci4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNYXJ0aW4gUmVpdGVyZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZU5vZGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVZhbHVlZEtleVRyZWVOb2RlIGV4dGVuZHMgSUtleVRyZWVOb2RlIHsKKworCXB1YmxpYyB2b2lkIGluaXRWYWx1ZXMoTWFwPExvY2FsZSwgU3RyaW5nPiB2YWx1ZXMpOworCisJcHVibGljIHZvaWQgYWRkVmFsdWUoTG9jYWxlIGxvY2FsZSwgU3RyaW5nIHZhbHVlKTsKKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKExvY2FsZSBsb2NhbGUsIFN0cmluZyBuZXdWYWx1ZSk7CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKExvY2FsZSBsb2NhbGUpOworCisJcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRWYWx1ZXMoKTsKKworCXB1YmxpYyB2b2lkIHNldEluZm8oT2JqZWN0IGluZm8pOworCisJcHVibGljIE9iamVjdCBnZXRJbmZvKCk7CisKKwlwdWJsaWMgQ29sbGVjdGlvbjxMb2NhbGU+IGdldExvY2FsZXMoKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYXBpL0tleVRyZWVGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9hcGkvS2V5VHJlZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGM5OTgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYXBpL0tleVRyZWVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBBbGV4ZWogU3RyZWx6b3cuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgQWxleGVqIFN0cmVsem93IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuYXBpOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLklBYnN0cmFjdEtleVRyZWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuaW50ZXJuYWwuQWJzdHJhY3RLZXlUcmVlTW9kZWw7CisKKworLyoqCisgKiBGYWN0b3J5IGNsYXNzIGZvciB0aGUgdHJlZSBvciBub2RlcyBvZiB0aGUgdHJlZS4KKyAqIEBzZWUgSUFic3RyYWN0S2V5VHJlZU1vZGVsCisgKiBAc2VlIElWYWx1ZWRLZXlUcmVlTm9kZQorICogPGJyPjxicj4KKyAqIAorICogQGF1dGhvciBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGNsYXNzIEtleVRyZWVGYWN0b3J5IHsKKworCS8qKgorCSAqIEBwYXJhbSBtZXNzYWdlc0J1bmRsZUdyb3VwIElucHV0IG9mIHRoZSBrZXkgdHJlZSBtb2RlbAorCSAqIEByZXR1cm4gVGhlIHtAbGluayBJQWJzdHJhY3RLZXlUcmVlTW9kZWx9CisJICovCisgICAgcHVibGljIHN0YXRpYyBJQWJzdHJhY3RLZXlUcmVlTW9kZWwgY3JlYXRlTW9kZWwoSU1lc3NhZ2VzQnVuZGxlR3JvdXAgbWVzc2FnZXNCdW5kbGVHcm91cCkgeworICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0S2V5VHJlZU1vZGVsKChNZXNzYWdlc0J1bmRsZUdyb3VwKW1lc3NhZ2VzQnVuZGxlR3JvdXApOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgbm9kZQorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBub2RlCisgICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbm9kZSAobWVzc2FnZXMga2V5KQorICAgICAqIEBwYXJhbSBidW5kbGVHcm91cCBUaGUge0BsaW5rIElNZXNzYWdlc0J1bmRsZUdyb3VwfSAKKyAgICAgKiBAcmV0dXJuIEEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWVkS2V5VHJlZU5vZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJVmFsdWVkS2V5VHJlZU5vZGUgY3JlYXRlS2V5VHJlZShJS2V5VHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCAKKyAgICAJCUlNZXNzYWdlc0J1bmRsZUdyb3VwIGJ1bmRsZUdyb3VwKSB7CisgICAgICAgIHJldHVybiBuZXcgVmFsdWVkS2V5VHJlZU5vZGUocGFyZW50LCBuYW1lLCBpZCwgYnVuZGxlR3JvdXApOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FwaS9WYWx1ZWRLZXlUcmVlTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYXBpL1ZhbHVlZEtleVRyZWVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MWRiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2FwaS9WYWx1ZWRLZXlUcmVlTm9kZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFJlaXRlcmVyLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1hcnRpbiBSZWl0ZXJlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLklLZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5LZXlUcmVlTm9kZTsKKworCitwdWJsaWMgY2xhc3MgVmFsdWVkS2V5VHJlZU5vZGUgZXh0ZW5kcyBLZXlUcmVlTm9kZSBpbXBsZW1lbnRzIElWYWx1ZWRLZXlUcmVlTm9kZSB7CisKKyAgICBwdWJsaWMgVmFsdWVkS2V5VHJlZU5vZGUoSUtleVRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlS2V5LAorICAgICAgICAgICAgSU1lc3NhZ2VzQnVuZGxlR3JvdXAgbWVzc2FnZXNCdW5kbGVHcm91cCkgeworICAgICAgICBzdXBlcihwYXJlbnQsIG5hbWUsIG1lc3NhZ2VLZXksIG1lc3NhZ2VzQnVuZGxlR3JvdXApOworICAgIH0KKworICAgIHByaXZhdGUgTWFwPExvY2FsZSwgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxMb2NhbGUsIFN0cmluZz4oKTsKKyAgICBwcml2YXRlIE9iamVjdCBpbmZvOworCisgICAgcHVibGljIHZvaWQgaW5pdFZhbHVlcyAoTWFwPExvY2FsZSwgU3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVmFsdWUgKExvY2FsZSBsb2NhbGUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB2YWx1ZXMucHV0KGxvY2FsZSwgdmFsdWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlIChMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZXMuZ2V0KGxvY2FsZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKExvY2FsZSBsb2NhbGUsIFN0cmluZyBuZXdWYWx1ZSkgeworICAgIAlpZiAodmFsdWVzLmNvbnRhaW5zS2V5KGxvY2FsZSkpCisgICAgCQl2YWx1ZXMucmVtb3ZlKGxvY2FsZSk7CisgICAgCWFkZFZhbHVlKGxvY2FsZSwgbmV3VmFsdWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFZhbHVlcyAoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZXMudmFsdWVzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5mbyhPYmplY3QgaW5mbykgeworICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDb2xsZWN0aW9uPExvY2FsZT4gZ2V0TG9jYWxlcyAoKSB7CisgICAgICAgIExpc3Q8TG9jYWxlPiBsb2NzID0gbmV3IEFycmF5TGlzdDxMb2NhbGU+ICgpOworICAgICAgICBmb3IgKExvY2FsZSBsb2MgOiB2YWx1ZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGxvY3MuYWRkKGxvYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY3M7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVpbGRlci9CdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idWlsZGVyL0J1aWxkZXIuamF2YQppbmRleCBlOGNhMmM1Li4wYjA4MWJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idWlsZGVyL0J1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idWlsZGVyL0J1aWxkZXIuamF2YQpAQCAtMTgsOCArMTgsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLm1hbmFnZXIuUkJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5idW5kbGUuTWVzc2FnZXNCdW5kbGVHcm91cEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnBsdWdpbi5NZXNzYWdlc0VkaXRvclBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmVzb3VyY2UudmFsaWRhdG9yLkZpbGVNYXJrZXJTdHJhdGVneTsKQEAgLTYyLDYgKzY0LDcgQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJCRSBERUxUQSBSZW1vdmVkIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBSQk1hbmFnZXIuZ2V0SW5zdGFuY2UoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkpLm5vdGlmeVJlc291cmNlUmVtb3ZlZChkZWx0YS5nZXRSZXNvdXJjZSgpKTsKIAkJCQkvLyBoYW5kbGUgcmVtb3ZlZCByZXNvdXJjZQogCQkJCWJyZWFrOwogCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgpAQCAtMTM0LDcgKzEzNyw3IEBACiAJCQkJaWYgKF9hbHJlYWRCdWlsdE1lc3NhZ2VCdW5kbGUgIT0gbnVsbCkgewogCQkJCQlmb3IgKE1lc3NhZ2VzQnVuZGxlR3JvdXAgbXNnR3JwIDogX2FscmVhZEJ1aWx0TWVzc2FnZUJ1bmRsZS52YWx1ZXMoKSkgewogCQkJCQkJdHJ5IHsKLQkJCQkJCQltc2dHcnAuZGlzcG9zZSgpOworLy8JCQkJCQkJbXNnR3JwLmRpc3Bvc2UoKTsgLy8gVE9ETzogW2Fsc3RdIGRvIHdlIG5lZWQgdGhpcyByZWFsbHk/CiAJCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewogCQkJCQkJCS8vRklYTUU6IHJlbW92ZSB0aGlzIGRlYnVnZ2luZzoKIAkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oCkBAIC0xNjcsNiArMTcwLDggQEAKIAkgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIGN1cnJlbnRseSB2YWxpZGF0ZWQuCiAJICovCiAJdm9pZCBjaGVja0J1bmRsZVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgeworCQlpZiAodHJ1ZSkKKwkJcmV0dXJuOyAvLyBUT0RPIFthbHN0XSAKICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgJiYgcmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKAogICAgICAgICAgICAgICAgICIucHJvcGVydGllcyIpKSB7IC8vJE5PTi1OTFMtMSQgLy9UT0RPIGhhdmUgY3VzdG9taXplZD8KICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwpAQCAtMTkwLDE0ICsxOTUsMTQgQEAKICAgICAgICAgICAgIAkJLy9jaGVhcGVyIHRoYW4gY3JlYXRpbmcgYSBncm91cCBmb3IgZWFjaCBvbiBvZiB0aG9zZQogICAgICAgICAgICAgCQkvL2ZpbGVzLgogICAgICAgICAgICAgCQlib29sZWFuIHZhbGlkYXRlRW50aXJlR3JvdXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAJZm9yIChNZXNzYWdlc0J1bmRsZSBtc2dCdW5kbGUgOiBtc2dCdW5kbGVHcnAuZ2V0TWVzc2FnZXNCdW5kbGVzKCkpIHsKLSAgICAgICAgICAgIAkJCU9iamVjdCBzcmMgPSBtc2dCdW5kbGUuZ2V0UmVzb3VyY2UoKS5nZXRTb3VyY2UoKTsKKyAgICAgICAgICAgICAgICAJZm9yIChJTWVzc2FnZXNCdW5kbGUgbXNnQnVuZGxlIDogbXNnQnVuZGxlR3JwLmdldE1lc3NhZ2VzQnVuZGxlcygpKSB7CisgICAgICAgICAgICAJCQlPYmplY3Qgc3JjID0gKChNZXNzYWdlc0J1bmRsZSltc2dCdW5kbGUpLmdldFJlc291cmNlKCkuZ2V0U291cmNlKCk7CiAgICAgICAgICAgICAJCQkvL1N5c3RlbS5lcnIucHJpbnRsbihzcmMgKyAiIC0+ICIgKyBtc2dCdW5kbGVHcnApOwogICAgICAgICAgICAgCQkJaWYgKHNyYyBpbnN0YW5jZW9mIElGaWxlKSB7Ly93aGVuIGl0IGlzIGEgcmVhZC1vbmx5IHRoaW5nIHdlIGRvbid0IGluZGV4IGl0LgogCSAgICAgICAgICAgIAkJCV9hbHJlYWRCdWlsdE1lc3NhZ2VCdW5kbGUucHV0KChJRmlsZSlzcmMsIG1zZ0J1bmRsZUdycCk7CiAJICAgICAgICAgICAgCQkJaWYgKCF2YWxpZGF0ZUVudGlyZUdyb3VwICYmIHNyYyA9PSByZXNvdXJjZSkgewotCSAgICAgICAgICAgIAkJCQlpZiAobXNnQnVuZGxlLmdldExvY2FsZSgpID09IG51bGwKLQkgICAgICAgICAgICAJCQkJCQl8fCBtc2dCdW5kbGUuZ2V0TG9jYWxlKCkuZXF1YWxzKFVJVXRpbHMuUk9PVF9MT0NBTEUpKSB7CisJICAgICAgICAgICAgCQkJCWlmICgoKE1lc3NhZ2VzQnVuZGxlKW1zZ0J1bmRsZSkuZ2V0TG9jYWxlKCkgPT0gbnVsbAorCSAgICAgICAgICAgIAkJCQkJCXx8ICgoTWVzc2FnZXNCdW5kbGUpbXNnQnVuZGxlKS5nZXRMb2NhbGUoKS5lcXVhbHMoVUlVdGlscy5ST09UX0xPQ0FMRSkpIHsKIAkgICAgICAgICAgICAJCQkJCS8vb2sgdGhlIGRlZmF1bHQgcHJvcGVydGllcyBoYXZlIGJlZW4gY2hhbmdlZC4KIAkgICAgICAgICAgICAJCQkJCS8vbWFrZSBzdXJlIHRoYXQgYWxsIHJlc291cmNlcyBpbiB0aGlzIGJ1bmRsZSBncm91cAogCSAgICAgICAgICAgIAkJCQkJLy9hcmUgdmFsaWRhdGVkIHRvbzoKQEAgLTIxMyw4ICsyMTgsOCBAQAogICAgICAgICAgICAgCQkJfQogICAgICAgICAgICAgCQl9CiAgICAgICAgICAgICAJCWlmICh2YWxpZGF0ZUVudGlyZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlmb3IgKE1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IG1zZ0J1bmRsZUdycC5nZXRNZXNzYWdlc0J1bmRsZXMoKSkgewotCQkJICAgIAkJCU9iamVjdCBzcmMgPSBtc2dCdW5kbGUuZ2V0UmVzb3VyY2UoKS5nZXRTb3VyY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgCWZvciAoSU1lc3NhZ2VzQnVuZGxlIG1zZ0J1bmRsZSA6IG1zZ0J1bmRsZUdycC5nZXRNZXNzYWdlc0J1bmRsZXMoKSkgeworCQkJICAgIAkJCU9iamVjdCBzcmMgPSAoKE1lc3NhZ2VzQnVuZGxlKW1zZ0J1bmRsZSkuZ2V0UmVzb3VyY2UoKS5nZXRTb3VyY2UoKTsKIAkJCSAgICAJCQlfcmVzb3VyY2VzVG9WYWxpZGF0ZS5hZGQoc3JjKTsKICAgICAgICAgICAgICAgICAgICAJCX0KICAgICAgICAgICAgIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVuZGxlL0J1bmRsZUdyb3VwUmVnaXN0cnkuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2J1bmRsZS9CdW5kbGVHcm91cFJlZ2lzdHJ5LmphdmEKaW5kZXggNjRkMTc1My4uMjY3MmQxNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVuZGxlL0J1bmRsZUdyb3VwUmVnaXN0cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idW5kbGUvQnVuZGxlR3JvdXBSZWdpc3RyeS5qYXZhCkBAIC0xMCw3ICsxMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuYnVuZGxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2J1bmRsZS9EZWZhdWx0QnVuZGxlR3JvdXBTdHJhdGVneS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVuZGxlL0RlZmF1bHRCdW5kbGVHcm91cFN0cmF0ZWd5LmphdmEKaW5kZXggNjVkNDJmMC4uY2I4YWUyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVuZGxlL0RlZmF1bHRCdW5kbGVHcm91cFN0cmF0ZWd5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVuZGxlL0RlZmF1bHRCdW5kbGVHcm91cFN0cmF0ZWd5LmphdmEKQEAgLTcsMTcgKzcsMTkgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBBbGV4ZWogU3RyZWx6b3cgLSBUYXBKSSBpbnRlZ3JhdGlvbiwgbWVzc2FnZXNCdW5kbGVJZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmJ1bmRsZTsKIAoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLlByb3BlcnRpZXNJRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5pbnRlcm5hbC5Qcm9wZXJ0aWVzSUZpbGVSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLlByb3BlcnRpZXNEZXNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5Qcm9wZXJ0aWVzU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2Uuc3RyYXRlZ3kuSU1lc3NhZ2VzQnVuZGxlR3JvdXBTdHJhdGVneTsKQEAgLTI5LDcgKzMxLDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CkBAIC04NywxMSArOTQsMzUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5zdHJhdGVneS5JTWVzc2FnZXNCdW5kbGVHcm91cFN0cmF0ZWd5CisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuc3RyYXRlZ3kuSU1lc3NhZ2VzQnVuZGxlR3JvdXBTdHJhdGVneQogICAgICAqICAgICAgICAgICNjcmVhdGVNZXNzYWdlc0J1bmRsZUdyb3VwTmFtZSgpCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBjcmVhdGVNZXNzYWdlc0J1bmRsZUdyb3VwTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lICsgIlsuLi5dLiIgKyBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsgLy8kTk9OLU5MUy0xJAorICAgIAlyZXR1cm4gZ2V0UHJvamVjdE5hbWUoKSsiKi5wcm9wZXJ0aWVzIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVNZXNzYWdlc0J1bmRsZUlkKCkgeworICAgIAlyZXR1cm4gZ2V0UmVzb3VyY2VCdW5kbGVJZChmaWxlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVJZCAoSVJlc291cmNlIHJlc291cmNlKSB7CisJCVN0cmluZyBwYWNrYWdlRnJhZ21lbnQgPSAiIjsKKworCQlJSmF2YUVsZW1lbnQgcHJvcGVydHlGaWxlID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlLmdldFBhcmVudCgpKTsKKwkJaWYgKHByb3BlcnR5RmlsZSAhPSBudWxsICYmIHByb3BlcnR5RmlsZSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpCisJCQlwYWNrYWdlRnJhZ21lbnQgPSAoKElQYWNrYWdlRnJhZ21lbnQpIHByb3BlcnR5RmlsZSkuZ2V0RWxlbWVudE5hbWUoKTsKKwkJCisJCXJldHVybiAocGFja2FnZUZyYWdtZW50Lmxlbmd0aCgpID4gMCA/IHBhY2thZ2VGcmFnbWVudCAgKyAiLiIgOiAiIikgKyAKKwkJCQlnZXRSZXNvdXJjZUJ1bmRsZU5hbWUocmVzb3VyY2UpOworCX0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoSVJlc291cmNlIHJlcykgeworICAgICAgICBTdHJpbmcgbmFtZSA9IHJlcy5nZXROYW1lKCk7CisgICAgCVN0cmluZyByZWdleCA9ICJeKC4qPykiIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICArICIoKF9bYS16XXsyLDN9KXwoX1thLXpdezIsM31fW0EtWl17Mn0pIiAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgKyAifChfW2Etel17MiwzfV9bQS1aXXsyfV9cXHcqKSk/KFxcLiIgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICsgcmVzLmdldEZpbGVFeHRlbnNpb24oKSArICIpJCI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZUZpcnN0KHJlZ2V4LCAiJDEiKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgpAQCAtMTM4LDggKzE2OSwyMiBAQAogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5idW5kbGUuSUJ1bmRsZUdyb3VwU3RyYXRlZ3kjY3JlYXRlQnVuZGxlKGphdmEudXRpbC5Mb2NhbGUpCiAgICAgICovCiAgICAgcHVibGljIE1lc3NhZ2VzQnVuZGxlIGNyZWF0ZU1lc3NhZ2VzQnVuZGxlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAJLy8gY3JlYXRlIG5ldyBlbXB0eSBsb2NhbGUgZmlsZQorICAgIAlJRmlsZSBvcGVuZWRGaWxlID0gZ2V0T3BlbmVkRmlsZSgpOworICAgIAlJUGF0aCBwYXRoID0gb3BlbmVkRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CisgICAgCVN0cmluZyBsb2NhbGVTdHIgPSBsb2NhbGUgIT0gbnVsbCA/ICJfIiArIGxvY2FsZS50b1N0cmluZygpIDogIiI7CisgICAgCVN0cmluZyBuZXdGaWxlbmFtZSA9IGdldEJhc2VOYW1lKCkrbG9jYWxlU3RyKyIuIitvcGVuZWRGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKKyAgICAgICAgSUZpbGUgbmV3RmlsZSA9IG9wZW5lZEZpbGUuZ2V0UHJvamVjdCgpLmdldEZpbGUocGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKStuZXdGaWxlbmFtZSk7CisgICAgICAgIAorICAgICAgICBpZiAoISBuZXdGaWxlLmV4aXN0cygpKSB7CisgICAgICAgIAl0cnkgeworICAgICAgICAJCS8vIGNyZWF0ZSBuZXcgaWZpbGUgd2l0aCBhbiBlbXB0eSBpbnB1dCBzdHJlYW0KKwkJCQluZXdGaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pLCBJUmVzb3VyY2UuTk9ORSwgbnVsbCk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfSAKKyAgICAgICAgfQorICAgIAlyZXR1cm4gY3JlYXRlQnVuZGxlKGxvY2FsZSwgbmV3RmlsZSk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTYwLDE0ICsyMDUsMTQgQEAKICAgICAgICAgICAgIAkvL3NpdGUgaXMgbnVsbCBkdXJpbmcgdGhlIGJ1aWxkLgogICAgICAgICAgICAgICAgIG1lc3NhZ2VzUmVzb3VyY2UgPSBuZXcgUHJvcGVydGllc0lGaWxlUmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIocHJlZnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNEZXNlcmlhbGl6ZXIocHJlZnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNTZXJpYWxpemVyKHByZWZzLmdldFNlcmlhbGl6ZXJDb25maWcoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc0Rlc2VyaWFsaXplcihwcmVmcy5nZXREZXNlcmlhbGl6ZXJDb25maWcoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAoSUZpbGUpIHJlc291cmNlLCBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtZXNzYWdlc1Jlc291cmNlID0gbmV3IEVjbGlwc2VQcm9wZXJ0aWVzRWRpdG9yUmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIocHJlZnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNEZXNlcmlhbGl6ZXIocHJlZnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNTZXJpYWxpemVyKHByZWZzLmdldFNlcmlhbGl6ZXJDb25maWcoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc0Rlc2VyaWFsaXplcihwcmVmcy5nZXREZXNlcmlhbGl6ZXJDb25maWcoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFZGl0b3IocmVzb3VyY2UsIGxvY2FsZSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlc0J1bmRsZShtZXNzYWdlc1Jlc291cmNlKTsKQEAgLTE5MSw2ICsyMzYsMTIgQEAKICAgICAgICAgCiAgICAgICAgIFRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7CiAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgCXRyeSB7CisJCQkJcmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CiAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgbmV3RWRpdG9ySW5wdXQgPSAKICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIHJlc291cmNlKTsKICAgICAgICAgICAgIHRleHRFZGl0b3IgPSBudWxsOwpAQCAtMjE0LDExICsyNjUsMTUgQEAKICAgICAJcmV0dXJuIGZpbGU7CiAgICAgfQogCi0gICAgLyoqCisgICAgLyoqIAogICAgICAqIEByZXR1cm4gVGhlIGJhc2UgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7CiAgICAgCXJldHVybiBiYXNlTmFtZTsKICAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKKyAgICAJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChmaWxlLmdldEZ1bGxQYXRoKCkuc2VnbWVudHMoKVswXSkuZ2V0TmFtZSgpOworICAgIH0KICAgICAgICAgCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idW5kbGUvTWVzc2FnZXNCdW5kbGVHcm91cEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2J1bmRsZS9NZXNzYWdlc0J1bmRsZUdyb3VwRmFjdG9yeS5qYXZhCmluZGV4IGJmMDUxNmYuLmJjMjhkZjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2J1bmRsZS9NZXNzYWdlc0J1bmRsZUdyb3VwRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2J1bmRsZS9NZXNzYWdlc0J1bmRsZUdyb3VwRmFjdG9yeS5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZUdyb3VwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wcmVmZXJlbmNlcy5Nc2dFZGl0b3JQcmVmZXJlbmNlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CkBAIC02Miw5ICs2MiwxMSBAQAogCiAgICAgCS8vY2hlY2sgd2UgYXJlIGluc2lkZSBhbiBlY2xpcHNlIHBsdWdpbiBwcm9qZWN0IHdoZXJlIE5MIGlzIHN1cHBvcnRlZCBhdCBydW50aW1lOgogCQlJUHJvamVjdCBwcm9qID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qID09IG51bGwgfHwgIVVJVXRpbHMuaGFzTmF0dXJlKHByb2osIFVJVXRpbHMuUERFX05BVFVSRSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRCdW5kbGVHcm91cChzaXRlLCBmaWxlKTsKLQkJfQorCQl0cnkgeworCQkgICAgaWYgKHByb2ogPT0gbnVsbCB8fCAhcHJvai5oYXNOYXR1cmUoVUlVdGlscy5QREVfTkFUVVJFKSkgeyAvLyROT04tTkxTLTEkCisJCSAgICAJcmV0dXJuIGNyZWF0ZURlZmF1bHRCdW5kbGVHcm91cChzaXRlLCBmaWxlKTsKKwkJICAgIH0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IH0KIAogICAgIAlJRm9sZGVyIG5sID0gZ2V0TkxGb2xkZXIoZmlsZSk7CiAgICAgCQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVuZGxlL05MRnJhZ21lbnRCdW5kbGVHcm91cFN0cmF0ZWd5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idW5kbGUvTkxGcmFnbWVudEJ1bmRsZUdyb3VwU3RyYXRlZ3kuamF2YQppbmRleCBlZjlkMTM0Li4yMjQ4YjY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idW5kbGUvTkxGcmFnbWVudEJ1bmRsZUdyb3VwU3RyYXRlZ3kuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idW5kbGUvTkxGcmFnbWVudEJ1bmRsZUdyb3VwU3RyYXRlZ3kuamF2YQpAQCAtMjUsOSArMjUsOSBAQAogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5Qcm9wZXJ0aWVzSUZpbGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuUHJvcGVydGllc1JlYWRPbmx5UmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5pbnRlcm5hbC5Qcm9wZXJ0aWVzSUZpbGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuaW50ZXJuYWwuUHJvcGVydGllc1JlYWRPbmx5UmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5Qcm9wZXJ0aWVzRGVzZXJpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIuUHJvcGVydGllc1NlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnBsdWdpbi5NZXNzYWdlc0VkaXRvclBsdWdpbjsKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnN0cmF0ZWd5LklNZXNzYWdlc0J1bmRsZUdyb3VwU3RyYXRlZ3kKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5zdHJhdGVneS5JTWVzc2FnZXNCdW5kbGVHcm91cFN0cmF0ZWd5CiAgICAgICogICAgICAgICAgI2NyZWF0ZU1lc3NhZ2VzQnVuZGxlR3JvdXBOYW1lKCkKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU1lc3NhZ2VzQnVuZGxlR3JvdXBOYW1lKCkgewpAQCAtMTc1LDggKzE3NSw4IEBACiAJCQkJCQlyZXR1cm4gbmV3IE1lc3NhZ2VzQnVuZGxlKAogCQkJCQkJICAgICAgICBuZXcgUHJvcGVydGllc1JlYWRPbmx5UmVzb3VyY2UoCiAJCQkJCQkJCQlVSVV0aWxzLlJPT1RfTE9DQUxFLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0aWVzU2VyaWFsaXplcihwcmVmcyksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc0Rlc2VyaWFsaXplcihwcmVmcyksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIocHJlZnMuZ2V0U2VyaWFsaXplckNvbmZpZygpKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0aWVzRGVzZXJpYWxpemVyKHByZWZzLmdldERlc2VyaWFsaXplckNvbmZpZygpKSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphcnJlZFByb3BzWzBdLCBqYXJyZWRQcm9wc1sxXSkpOwogCQkJCQl9CiAJCQkJCW5ld0VkaXRvcklucHV0ID0gbmV3IER1bW15RWRpdG9ySW5wdXQoamFycmVkUHJvcHNbMF0sIApAQCAtMTk1LDggKzE5NSw4IEBACiAJCQkJCSAgICAgICAgTXNnRWRpdG9yUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKTsKIAkJCQkJcmV0dXJuIG5ldyBNZXNzYWdlc0J1bmRsZShuZXcgUHJvcGVydGllc0lGaWxlUmVzb3VyY2UoCiAJCQkJCQkJCVVJVXRpbHMuUk9PVF9MT0NBTEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIocHJlZnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc0Rlc2VyaWFsaXplcihwcmVmcyksIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0aWVzU2VyaWFsaXplcihwcmVmcy5nZXRTZXJpYWxpemVyQ29uZmlnKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc0Rlc2VyaWFsaXplcihwcmVmcy5nZXREZXNlcmlhbGl6ZXJDb25maWcoKSksIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKSkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCS8vZHVyaW5nIHRoZSBidWlsZCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gc2tpcC4KQEAgLTI1MCw4ICsyNTAsOCBAQAogCQkJCQkJcmV0dXJuIG5ldyBNZXNzYWdlc0J1bmRsZSgKIAkJCQkJCSAgICAgICAgbmV3IFByb3BlcnRpZXNSZWFkT25seVJlc291cmNlKAogCQkJCQkJCQkJVUlVdGlscy5ST09UX0xPQ0FMRSwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIocHJlZnMpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNEZXNlcmlhbGl6ZXIocHJlZnMpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNTZXJpYWxpemVyKHByZWZzLmdldFNlcmlhbGl6ZXJDb25maWcoKSksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc0Rlc2VyaWFsaXplcihwcmVmcy5nZXREZXNlcmlhbGl6ZXJDb25maWcoKSksCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywgcmVzb3VyY2VMb2NhdGlvbkxhYmVsKSk7CiAJICAgICAgICAgICAgCX0KIAkgICAgICAgICAgICAgICAgbmV3RWRpdG9ySW5wdXQgPSBuZXcgRHVtbXlFZGl0b3JJbnB1dChjb250ZW50cywgCkBAIC0yOTAsOCArMjkwLDggQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZSByZWFkT25seSA9CiAgICAgICAgICAgICAgICAgIG5ldyBFY2xpcHNlUHJvcGVydGllc0VkaXRvclJlc291cmNlKFVJVXRpbHMuUk9PVF9MT0NBTEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNTZXJpYWxpemVyKHByZWZzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0aWVzRGVzZXJpYWxpemVyKHByZWZzKSwgdGV4dEVkaXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIocHJlZnMuZ2V0U2VyaWFsaXplckNvbmZpZygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0aWVzRGVzZXJpYWxpemVyKHByZWZzLmdldERlc2VyaWFsaXplckNvbmZpZygpKSwgdGV4dEVkaXRvcik7CiAgICAgICAgICAgICBpZiAocmVzb3VyY2VMb2NhdGlvbkxhYmVsICE9IG51bGwpIHsKICAgICAgICAgICAgIAlyZWFkT25seS5zZXRSZXNvdXJjZUxvY2F0aW9uTGFiZWwocmVzb3VyY2VMb2NhdGlvbkxhYmVsKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2J1bmRsZS9OTFBsdWdpbkJ1bmRsZUdyb3VwU3RyYXRlZ3kuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2J1bmRsZS9OTFBsdWdpbkJ1bmRsZUdyb3VwU3RyYXRlZ3kuamF2YQppbmRleCBiZjQyZmJmLi4yYjQ0ZDM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idW5kbGUvTkxQbHVnaW5CdW5kbGVHcm91cFN0cmF0ZWd5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVuZGxlL05MUGx1Z2luQnVuZGxlR3JvdXBTdHJhdGVneS5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWwuQmFiZWxVdGlsczsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL0VudHJ5UmlnaHRCYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vRW50cnlSaWdodEJhbm5lci5qYXZhCmluZGV4IDM1MTRjZDYuLjFjZDI4Y2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vRW50cnlSaWdodEJhbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vRW50cnlSaWdodEJhbm5lci5qYXZhCkBAIC0xNywxMyArMTcsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2ZXI7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLkR1cGxpY2F0ZVZhbHVlQ2hlY2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5JTWVzc2FnZUNoZWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MuTWlzc2luZ1ZhbHVlQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvckNoYW5nZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5pbnRlcm5hbC5EdXBsaWNhdGVWYWx1ZUNoZWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MuaW50ZXJuYWwuTWlzc2luZ1ZhbHVlQ2hlY2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmkxOG4uYWN0aW9ucy5TaG93RHVwbGljYXRlQWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pMThuLmFjdGlvbnMuU2hvd01pc3NpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pbnRlcm5hbC5NZXNzYWdlc0VkaXRvckNoYW5nZUFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vSTE4TkVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL0kxOE5FbnRyeS5qYXZhCmluZGV4IDAwNjZmOWQuLjEzYzc4OWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vSTE4TkVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9JMThORW50cnkuamF2YQpAQCAtNywxNiArNywyMCBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIEFsZXhlaiBTdHJlbHpvdyAtIHVwZGF0ZUtleQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmkxOG47CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5tYW5hZ2VyLlJCTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLnV0aWwuQmFiZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci53aWRnZXRzLk51bGxhYmxlVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwpAQCAtNDAsNyArNDQsOCBAQAogcHVibGljIGNsYXNzIEkxOE5FbnRyeSBleHRlbmRzIENvbXBvc2l0ZSB7CiAKICAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VzRWRpdG9yIGVkaXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VzQnVuZGxlR3JvdXAgbWVzc2FnZXNCdW5kbGVHcm91cDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBidW5kbGVHcm91cElkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lOwogICAgIHByaXZhdGUgZmluYWwgTG9jYWxlIGxvY2FsZTsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBleHBhbmRlZCA9IHRydWU7CkBAIC02MCw3ICs2NSw4IEBACiAgICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwogICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7Ci0gICAgICAgIHRoaXMubWVzc2FnZXNCdW5kbGVHcm91cCA9IGVkaXRvci5nZXRCdW5kbGVHcm91cCgpOworICAgICAgICB0aGlzLmJ1bmRsZUdyb3VwSWQgPSBlZGl0b3IuZ2V0QnVuZGxlR3JvdXAoKS5nZXRSZXNvdXJjZUJ1bmRsZUlkKCk7CisgICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBlZGl0b3IuZ2V0QnVuZGxlR3JvdXAoKS5nZXRQcm9qZWN0TmFtZSgpOwogICAgICAgICAKICAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOyAgICAgICAgCiAgICAgICAgIGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwpAQCAtMTQ3LDEyICsxNTMsMTUgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLSAgICAJcmV0dXJuICgoVGV4dEVkaXRvcikgbWVzc2FnZXNCdW5kbGVHcm91cC4KLSAgICAgICAgCWdldE1lc3NhZ2VzQnVuZGxlKGxvY2FsZSkuZ2V0UmVzb3VyY2UoKS5nZXRTb3VyY2UoKSkuaXNFZGl0YWJsZSgpOworICAgIAlJTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwID0gUkJNYW5hZ2VyLmdldEluc3RhbmNlKHByb2plY3ROYW1lKS5nZXRNZXNzYWdlc0J1bmRsZUdyb3VwKGJ1bmRsZUdyb3VwSWQpOworICAgICAgICBJTWVzc2FnZXNCdW5kbGUgYnVuZGxlID0gbWVzc2FnZXNCdW5kbGVHcm91cC5nZXRNZXNzYWdlc0J1bmRsZShsb2NhbGUpOworICAgIAlyZXR1cm4gKChUZXh0RWRpdG9yKSBidW5kbGUuZ2V0UmVzb3VyY2UoKS5nZXRTb3VyY2UoKSkuaXNFZGl0YWJsZSgpOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTG9jYXRpb25MYWJlbCgpIHsKLSAgICAJcmV0dXJuIG1lc3NhZ2VzQnVuZGxlR3JvdXAuZ2V0TWVzc2FnZXNCdW5kbGUobG9jYWxlKS5nZXRSZXNvdXJjZSgpLmdldFJlc291cmNlTG9jYXRpb25MYWJlbCgpOworICAgIAlJTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwID0gUkJNYW5hZ2VyLmdldEluc3RhbmNlKHByb2plY3ROYW1lKS5nZXRNZXNzYWdlc0J1bmRsZUdyb3VwKGJ1bmRsZUdyb3VwSWQpOworICAgIAlJTWVzc2FnZXNCdW5kbGUgYnVuZGxlID0gbWVzc2FnZXNCdW5kbGVHcm91cC5nZXRNZXNzYWdlc0J1bmRsZShsb2NhbGUpOworICAgIAlyZXR1cm4gYnVuZGxlLmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VMb2NhdGlvbkxhYmVsKCk7CiAgICAgfQogICAgIAogLy8gICAgLypkZWZhdWx0Ki8gVGV4dCBnZXRUZXh0Qm94KCkgewpAQCAtMjM2LDM1ICsyNDUsNDMgQEAKICAgICAgICAgCiAgICAgICAgIGVkaXRvci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgTWVzc2FnZXNFZGl0b3JDaGFuZ2VBZGFwdGVyKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0ZWRLZXlDaGFuZ2VkKFN0cmluZyBvbGRLZXksIFN0cmluZyBuZXdLZXkpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzS2V5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0tleSAhPSBudWxsICYmIG1lc3NhZ2VzQnVuZGxlR3JvdXAuaXNNZXNzYWdlS2V5KG5ld0tleSk7Ci0gICAgICAgICAgICAgICAgdGV4dEJveC5zZXRFbmFibGVkKGlzS2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoaXNLZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBlbnRyeSA9IG1lc3NhZ2VzQnVuZGxlR3JvdXAuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdLZXksIGxvY2FsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJveC5zZXRUZXh0KG51bGwpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oYnVuZGxlRW50cnkuaXNDb21tZW50ZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Qm94LnNldFRleHQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0ZXh0Qm94LnNldFRleHQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCXVwZGF0ZUtleShuZXdLZXkpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIAogICAgIH0KKyAgICAKKwl2b2lkIHVwZGF0ZUtleShTdHJpbmcga2V5KSB7CisJCUlNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXAgPSBSQk1hbmFnZXIuZ2V0SW5zdGFuY2UoCisJCQkJcHJvamVjdE5hbWUpLmdldE1lc3NhZ2VzQnVuZGxlR3JvdXAoYnVuZGxlR3JvdXBJZCk7CisJCWJvb2xlYW4gaXNLZXkgPSBrZXkgIT0gbnVsbCAmJiBtZXNzYWdlc0J1bmRsZUdyb3VwLmlzTWVzc2FnZUtleShrZXkpOworCQl0ZXh0Qm94LnNldEVuYWJsZWQoaXNLZXkpOworCQlpZiAoaXNLZXkpIHsKKwkJCUlNZXNzYWdlIGVudHJ5ID0gbWVzc2FnZXNCdW5kbGVHcm91cC5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKKwkJCWlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgeworCQkJCXRleHRCb3guc2V0VGV4dChudWxsKTsKKwkJCQkvLyBjb21tZW50ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBjb21tZW50ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oYnVuZGxlRW50cnkuaXNDb21tZW50ZWQoKSk7CisJCQkJdGV4dEJveC5zZXRUZXh0KGVudHJ5LmdldFZhbHVlKCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGV4dEJveC5zZXRUZXh0KG51bGwpOworCQl9CisJfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1vZGVsKCkgewogICAgICAgICBpZiAoZWRpdG9yLmdldFNlbGVjdGVkS2V5KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKCFCYWJlbFV0aWxzLmVxdWFscyhmb2N1c0dhaW5lZFRleHQsIHRleHRCb3guZ2V0VGV4dCgpKSkgeworICAgICAgICAgICAgCUlNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXAgPSBSQk1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvamVjdE5hbWUpLmdldE1lc3NhZ2VzQnVuZGxlR3JvdXAoYnVuZGxlR3JvdXBJZCk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVkaXRvci5nZXRTZWxlY3RlZEtleSgpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgZW50cnkgPSBtZXNzYWdlc0J1bmRsZUdyb3VwLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOworICAgICAgICAgICAgICAgIElNZXNzYWdlIGVudHJ5ID0gbWVzc2FnZXNCdW5kbGVHcm91cC5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKICAgICAgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNCdW5kbGVHcm91cC5nZXRNZXNzYWdlc0J1bmRsZShsb2NhbGUpLmFkZE1lc3NhZ2UoZW50cnkpOworICAgICAgICAgICAgICAgICAgICBJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUgPSBtZXNzYWdlc0J1bmRsZUdyb3VwLmdldE1lc3NhZ2VzQnVuZGxlKGxvY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc0J1bmRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIAltZXNzYWdlc0J1bmRsZS5hZGRNZXNzYWdlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbnRyeS5zZXRUZXh0KHRleHRCb3guZ2V0VGV4dCgpKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vSTE4TlBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vSTE4TlBhZ2UuamF2YQppbmRleCBjYzJiZmM4Li4yZWZlNDMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL0kxOE5QYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9JMThOUGFnZS5qYXZhCkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIEFsZXhlaiBTdHJlbHpvdyAtIFRhcGlKSSBpbnRlZ3JhdGlvbiwgZml4ZWQgaXNzdWVzIDM3LCA0OAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmkxOG47CiAKQEAgLTE1LDEwICsxNiwxOCBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5JTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLm1hbmFnZXIuSU1lc3NhZ2VzRWRpdG9yTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLm1hbmFnZXIuUkJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5JTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7CkBAIC0zMiw3ICs0MSw3IEBACiAgKiBhdCBvbmNlIGZvciBhbGwgc3VwcG9ydGVkIGxvY2FsZXMuCiAgKiBAYXV0aG9yIFBhc2NhbCBFc3NpZW1icmUKICAqLwotcHVibGljIGNsYXNzIEkxOE5QYWdlIGV4dGVuZHMgU2Nyb2xsZWRDb21wb3NpdGUgeworcHVibGljIGNsYXNzIEkxOE5QYWdlIGV4dGVuZHMgU2Nyb2xsZWRDb21wb3NpdGUgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIgewogCiAgICAgLyoqIE1pbmltdW0gaGVpZ2h0IG9mIHRleHQgZmllbGRzLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX01JTl9IRUlHSFQgPSA5MDsKQEAgLTQxLDYgKzUwLDcgQEAKICAgICBwcml2YXRlIGZpbmFsIFNpZGVOYXZDb21wb3NpdGUga2V5c0NvbXBvc2l0ZTsKICAgICBwcml2YXRlIGZpbmFsIENvbXBvc2l0ZSB2YWx1ZXNDb21wb3NpdGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8TG9jYWxlLEkxOE5FbnRyeT4gZW50cnlDb21wb3NpdGVzID0gbmV3IEhhc2hNYXA8TG9jYWxlLEkxOE5FbnRyeT4oKTsgCisgICAgcHJpdmF0ZSBDb21wb3NpdGUgZW50cmllc0NvbXBvc2l0ZTsKICAgICAKIC8vICAgIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKICAgICBwcml2YXRlIGJvb2xlYW4ga2V5VHJlZVZpc2libGUgPSB0cnVlOwpAQCAtOTIsNyArMTAyLDI3IEBACiAgICAgICAgIHNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7CiAgICAgICAgIHNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwogICAgICAgICBzZXRNaW5XaWR0aCg0MDApOwotCisgICAgICAgIAorICAgICAgICBSQk1hbmFnZXIgaW5zdGFuY2UgPSBSQk1hbmFnZXIuZ2V0SW5zdGFuY2UoZWRpdG9yLmdldEJ1bmRsZUdyb3VwKCkuZ2V0UHJvamVjdE5hbWUoKSk7CisgICAgICAgIGluc3RhbmNlLmFkZE1lc3NhZ2VzRWRpdG9yTGlzdGVuZXIobmV3IElNZXNzYWdlc0VkaXRvckxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCBvblNhdmUoKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCQorCQkJfQorCQkJCisJCQlwdWJsaWMgdm9pZCBvbk1vZGlmeSgpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIG9uUmVzb3VyY2VDaGFuZ2VkKElNZXNzYWdlc0J1bmRsZSBidW5kbGUpIHsKKwkJCQlJMThORW50cnkgaTE4bkVudHJ5ID0gZW50cnlDb21wb3NpdGVzLmdldChidW5kbGUuZ2V0TG9jYWxlKCkpOworCQkJCWlmIChpMThuRW50cnkgIT0gbnVsbCAmJiAhZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSB7CisJCQkJCWkxOG5FbnRyeS51cGRhdGVLZXkoU3RyaW5nLnZhbHVlT2YoKChJU3RydWN0dXJlZFNlbGVjdGlvbilnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJfSk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTI3LDcgKzE1Nyw3IEBACiAgICAgICAgIHNjcm9sbGVkQ29tcG9zaXRlLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwogICAgICAgICBzY3JvbGxlZENvbXBvc2l0ZS5zZXRTaXplKFNXVC5ERUZBVUxULCAxMDApOwogCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBlbnRyaWVzQ29tcG9zaXRlID0KKyAgICAgICAgZW50cmllc0NvbXBvc2l0ZSA9CiAgICAgICAgICAgICAgICAgbmV3IENvbXBvc2l0ZShzY3JvbGxlZENvbXBvc2l0ZSwgU1dULkJPUkRFUik7CiAgICAgICAgIHNjcm9sbGVkQ29tcG9zaXRlLnNldENvbnRlbnQoZW50cmllc0NvbXBvc2l0ZSk7CiAgICAgICAgIHNjcm9sbGVkQ29tcG9zaXRlLnNldE1pblNpemUoZW50cmllc0NvbXBvc2l0ZS5jb21wdXRlU2l6ZSgKQEAgLTE0MSwxMCArMTcxLDcgQEAKICAgICAgICAgbG9jYWxlcyA9IFVJVXRpbHMuZmlsdGVyTG9jYWxlcyhsb2NhbGVzKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlID0gbG9jYWxlc1tpXTsKLSAgICAgICAgICAgIEkxOE5FbnRyeSBpMThORW50cnkgPSBuZXcgSTE4TkVudHJ5KAotICAgICAgICAgICAgICAgICAgICBlbnRyaWVzQ29tcG9zaXRlLCBlZGl0b3IsIGxvY2FsZSk7Ci0vLyAgICAgICAgICAgIGVudHJ5Q29tcG9zaXRlLmFkZEZvY3VzTGlzdGVuZXIobG9jYWxCZWhhdmlvdXIpOwotICAgICAgICAgICAgZW50cnlDb21wb3NpdGVzLnB1dChsb2NhbGUsIGkxOE5FbnRyeSk7CisgICAgICAgICAgICBhZGRJMThORW50cnkoZWRpdG9yLCBsb2NhbGUpOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBlZGl0b3IuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IE1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcigpIHsKQEAgLTE2MCw2ICsxODcsMTQgQEAKICAgICAgICAgcmV0dXJuIHNjcm9sbGVkQ29tcG9zaXRlOwogICAgIH0KICAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRJMThORW50cnkoTWVzc2FnZXNFZGl0b3IgZWRpdG9yLCBMb2NhbGUgbG9jYWxlKSB7CisgICAgCUkxOE5FbnRyeSBpMThORW50cnkgPSBuZXcgSTE4TkVudHJ5KAorICAgICAgICAgICAgICAgIGVudHJpZXNDb21wb3NpdGUsIGVkaXRvciwgbG9jYWxlKTsKKy8vICAgICAgZW50cnlDb21wb3NpdGUuYWRkRm9jdXNMaXN0ZW5lcihsb2NhbEJlaGF2aW91cik7CisgICAgICAgIGVudHJ5Q29tcG9zaXRlcy5wdXQobG9jYWxlLCBpMThORW50cnkpOworICAgICAgICBlbnRyaWVzQ29tcG9zaXRlLmxheW91dCgpOworICAgIH0KKyAgICAKICAgICBwdWJsaWMgdm9pZCBzZWxlY3RMb2NhbGUoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBDb2xsZWN0aW9uPExvY2FsZT4gbG9jYWxlcyA9IGVudHJ5Q29tcG9zaXRlcy5rZXlTZXQoKTsKICAgICAgICAgZm9yIChMb2NhbGUgZW50cnlMb2NhbGUgOiBsb2NhbGVzKSB7CkBAIC0xNzYsNCArMjExLDI1IEBACiAvLyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGtleXNDb21wb3NpdGUuZ2V0VHJlZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGtleXNDb21wb3NpdGUuZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGtleXNDb21wb3NpdGUuZ2V0VHJlZVZpZXdlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisgICAgICAgIGtleXNDb21wb3NpdGUuZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgeworICAgIAlyZXR1cm4ga2V5c0NvbXBvc2l0ZS5nZXRUcmVlVmlld2VyKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9TaWRlTmF2Q29tcG9zaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL1NpZGVOYXZDb21wb3NpdGUuamF2YQppbmRleCA0NjI1ZTllLi44NmRhN2ZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL1NpZGVOYXZDb21wb3NpdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL1NpZGVOYXZDb21wb3NpdGUuamF2YQpAQCAtMTAsMTIgKzEwLDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaTE4bjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5LZXlUcmVlQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlLmFjdGlvbnMuQ29sbGFwc2VBbGxBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9ucy5FeHBhbmRBbGxBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9ucy5GbGF0TW9kZWxBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9ucy5UcmVlTW9kZWxBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuaW50ZXJuYWwuS2V5VHJlZUNvbnRyaWJ1dG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKQEAgLTcyLDEzICs3MiwyNyBAQAogICAgICAgICAKICAgICAgICAgLy9UT0RPIGhhdmUgdHdvIHRvb2xiYXJzLCBvbmUgbGVmdC1hbGlnbiwgYW5kIG9uZSByaWdodCwgd2l0aCBkcm9wCiAgICAgICAgIC8vZG93biBtZW51Ci0gICAgICAgIAorLy8gICAgICAgIGluaXRMaXN0ZW5lcigpOwogICAgICAgICAKIC8vICAgICAgICBjcmVhdGVUb3BTZWN0aW9uKCk7CiAgICAgICAgIGNyZWF0ZUtleVRyZWUoKTsKICAgICAgICAgbmV3IFNpZGVOYXZUZXh0Qm94Q29tcG9zaXRlKHRoaXMsIGVkaXRvcik7CiAgICAgfQogCisvLyAgICBwcml2YXRlIHZvaWQgaW5pdExpc3RlbmVyKCkgeworLy8gICAgICAgIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworLy8gICAgICAgICAgICAKKy8vICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisvLyAgICAgICAgICAgICAgICBpZiAoIUJvb2xlYW4udmFsdWVPZihTeXN0ZW0uZ2V0UHJvcGVydHkoImRpcnR5IikpKSB7CisvLyAgICAgICAgICAgICAgICAgICAgY3JlYXRlS2V5VHJlZSgpOworLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfTsKKy8vICAgICAgICAKKy8vICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKy8vICAgICAgICAKKy8vICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHRyZWUgdmlld2VyLgogICAgICAqIEByZXR1cm4gdHJlZSB2aWV3ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vU2lkZU5hdlRleHRCb3hDb21wb3NpdGUuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vU2lkZU5hdlRleHRCb3hDb21wb3NpdGUuamF2YQppbmRleCBmOTdhY2UyLi4wMmY4MmU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL1NpZGVOYXZUZXh0Qm94Q29tcG9zaXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9TaWRlTmF2VGV4dEJveENvbXBvc2l0ZS5qYXZhCkBAIC0xMCwxMCArMTAsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pMThuOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuSUtleVRyZWVOb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLnZpc2l0b3IuTm9kZVBhdGhSZWdleFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvckNoYW5nZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pbnRlcm5hbC5NZXNzYWdlc0VkaXRvckNoYW5nZUFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnBsdWdpbi5NZXNzYWdlc0VkaXRvclBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgTm9kZVBhdGhSZWdleFZpc2l0b3IgdmlzaXRvciA9IG5ldyBOb2RlUGF0aFJlZ2V4VmlzaXRvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXiIgKyBrZXkgKyAiLioiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5nZXRLZXlUcmVlTW9kZWwoKS5hY2NlcHQodmlzaXRvciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIEtleVRyZWVOb2RlIG5vZGUgPSB2aXNpdG9yLmdldEtleVRyZWVOb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIElLZXlUcmVlTm9kZSBub2RlID0gdmlzaXRvci5nZXRLZXlUcmVlTm9kZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jQWRkVGV4dEJveCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNldFNlbGVjdGVkS2V5KG5vZGUuZ2V0TWVzc2FnZUtleSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vYWN0aW9ucy9TaG93RHVwbGljYXRlQWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL2FjdGlvbnMvU2hvd0R1cGxpY2F0ZUFjdGlvbi5qYXZhCmluZGV4IGE5NTg2ZDcuLjA4ZTU3NjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vYWN0aW9ucy9TaG93RHVwbGljYXRlQWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9hY3Rpb25zL1Nob3dEdXBsaWNhdGVBY3Rpb24uamF2YQpAQCAtMTcsNTEgKzE3LDU0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CiAKLQogLyoqCiAgKiBAYXV0aG9yIFBhc2NhbCBFc3NpZW1icmUKLSAqCisgKiAKICAqLwogcHVibGljIGNsYXNzIFNob3dEdXBsaWNhdGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewogCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBrZXlzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIGZpbmFsIExvY2FsZSBsb2NhbGU7Ci0gICAgCi0gICAgLyoqCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBrZXlzOworCXByaXZhdGUgZmluYWwgU3RyaW5nIGtleTsKKwlwcml2YXRlIGZpbmFsIExvY2FsZSBsb2NhbGU7CisKKwkvKioKICAgICAgKiAKICAgICAgKi8KLSAgICBwdWJsaWMgU2hvd0R1cGxpY2F0ZUFjdGlvbihTdHJpbmdbXSBrZXlzLCBTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMua2V5cyA9IGtleXM7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKLSAgICAgICAgc2V0VGV4dCgiU2hvdyBkdXBsaWNhdGUga2V5cy4iKTsKLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIFVJVXRpbHMuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJkdXBsaWNhdGUuZ2lmIikpOwotICAgICAgICBzZXRUb29sVGlwVGV4dCgiVE9ETyBwdXQgc29tZXRoaW5nIGhlcmUiKTsgLy9UT0RPIHB1dCB0b29sdGlwCi0gICAgfQorCXB1YmxpYyBTaG93RHVwbGljYXRlQWN0aW9uKFN0cmluZ1tdIGtleXMsIFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5rZXlzID0ga2V5czsKKwkJdGhpcy5rZXkgPSBrZXk7CisJCXRoaXMubG9jYWxlID0gbG9jYWxlOworCQlzZXRUZXh0KCJTaG93IGR1cGxpY2F0ZSBrZXlzLiIpOworCQlzZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5nZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5JTUFHRV9EVVBMSUNBVEUpKTsKKwkJc2V0VG9vbFRpcFRleHQoIkNoZWNrIGR1cGxpY2F0ZSB2YWx1ZXMiKTsKKwl9CiAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgLy9UT0RPIGhhdmUgcHJlZmVyZW5jZSBmb3Igd2hldGhlciB0byBkbyBjcm9zcyBsb2NhbGUgY2hlY2tpbmcKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlwiIiArIGtleSArICJcIiAoIiArIFVJVXRpbHMuZ2V0RGlzcGxheU5hbWUobG9jYWxlKSArICIpIGhhcyB0aGUgc2FtZSAiCi0gICAgICAgICAgICAgICAgKyAidmFsdWUgYXMgdGhlIGZvbGxvd2luZyBrZXkocyk6IFxuXG4iKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZHVwbEtleSA9IGtleXNbaV07Ci0gICAgICAgICAgICBpZiAoIWtleS5lcXVhbHMoZHVwbEtleSkpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgICAgtyAiKTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGR1cGxLZXkpOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAoIiArIFVJVXRpbHMuZ2V0RGlzcGxheU5hbWUobG9jYWxlKSArICIpIik7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKLSAgICAgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLAotICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdmFsdWUiLAotICAgICAgICAgICAgICAgIGJ1Zi50b1N0cmluZygpKTsKLSAgICB9CisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gVE9ETyBoYXZlIHByZWZlcmVuY2UgZm9yIHdoZXRoZXIgdG8gZG8gY3Jvc3MgbG9jYWxlIGNoZWNraW5nCisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJcIiIgKyBrZXkgKyAiXCIgKCIKKwkJCQkrIFVJVXRpbHMuZ2V0RGlzcGxheU5hbWUobG9jYWxlKSArICIpIGhhcyB0aGUgc2FtZSAiCisJCQkJKyAidmFsdWUgYXMgdGhlIGZvbGxvd2luZyBrZXkocyk6IFxuXG4iKTsKKworCQlpZiAoa2V5cyAhPSBudWxsKSB7IC8vIGtleXMgPSBkdXBsaWNhdGVkIHZhbHVlcworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIGR1cGxLZXkgPSBrZXlzW2ldOworCQkJCWlmICgha2V5LmVxdWFscyhkdXBsS2V5KSkgeworCQkJCQlidWYuYXBwZW5kKCIgICAgtyAiKTsKKwkJCQkJYnVmLmFwcGVuZChkdXBsS2V5KTsKKwkJCQkJYnVmLmFwcGVuZCgiICgiICsgVUlVdGlscy5nZXREaXNwbGF5TmFtZShsb2NhbGUpICsgIikiKTsKKwkJCQkJYnVmLmFwcGVuZCgiXG4iKTsKKwkJCQl9CisJCQl9CisJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKKwkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgIkR1cGxpY2F0ZSB2YWx1ZSIsCisJCQkJCWJ1Zi50b1N0cmluZygpKTsKKwkJfQorCX0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaW50ZXJuYWwvTWVzc2FnZXNFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2ludGVybmFsL01lc3NhZ2VzRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxNWU2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2ludGVybmFsL01lc3NhZ2VzRWRpdG9yLmphdmEKQEAgLTAsMCArMSw1NjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGFzY2FsIEVzc2llbWJyZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgQWxleGVqIFN0cmVsem93IC0gVGFwSkkgaW50ZWdyYXRpb24sIGJ1ZyBmaXhlcyAmIGVuaGFuY2VtZW50cworICogICAgCQkJCSAgLSBpc3N1ZSAzNSwgMzYsIDQ4LCA3MworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLklNZXNzYWdlc0J1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXBBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5tYW5hZ2VyLlJCTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuaW50ZXJuYWwuQWJzdHJhY3RLZXlUcmVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLklNZXNzYWdlc0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmJ1aWxkZXIuVG9nZ2xlTmF0dXJlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5idW5kbGUuTWVzc2FnZXNCdW5kbGVHcm91cEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmkxOG4uSTE4TlBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnBsdWdpbi5NZXNzYWdlc0VkaXRvclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucHJlZmVyZW5jZXMuTXNnRWRpdG9yUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJlc291cmNlLkVjbGlwc2VQcm9wZXJ0aWVzRWRpdG9yUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnV0aWwuVUlVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Iudmlld3MuTWVzc2FnZXNCdW5kbGVHcm91cE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOworCisvKioKKyAqIE11bHRpLXBhZ2UgZWRpdG9yIGZvciBlZGl0aW5nIHJlc291cmNlIGJ1bmRsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlc0VkaXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQgaW1wbGVtZW50cyBJR290b01hcmtlciwKKyAgICAgICAgSU1lc3NhZ2VzRWRpdG9yIHsKKworCS8qKiBFZGl0b3IgSUQsIGFzIGRlZmluZWQgaW4gcGx1Z2luLnhtbC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSAib3JnLmVjbGlscHNlLmJhYmVsLmVkaXRvci5lZGl0b3IuTWVzc2FnZXNFZGl0b3IiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIFN0cmluZyBzZWxlY3RlZEtleTsKKwlwcml2YXRlIExpc3Q8SU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI+KAorCSAgICAgICAgMik7CisKKwkvKiogTWVzc2FnZXNCdW5kbGUgZ3JvdXAuICovCisJcHJpdmF0ZSBNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXA7CisKKwkvKiogUGFnZSB3aXRoIGtleSB0cmVlIGFuZCB0ZXh0IGZpZWxkcyBmb3IgYWxsIGxvY2FsZXMuICovCisJcHJpdmF0ZSBJMThOUGFnZSBpMThuUGFnZTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8TG9jYWxlPiBsb2NhbGVzSW5kZXggPSBuZXcgQXJyYXlMaXN0PExvY2FsZT4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8SVRleHRFZGl0b3I+IHRleHRFZGl0b3JzSW5kZXggPSBuZXcgQXJyYXlMaXN0PElUZXh0RWRpdG9yPigpOworCisJcHJpdmF0ZSBNZXNzYWdlc0J1bmRsZUdyb3VwT3V0bGluZSBvdXRsaW5lOworCisJcHJpdmF0ZSBNZXNzYWdlc0VkaXRvck1hcmtlcnMgbWFya2VyczsKKworCXByaXZhdGUgQWJzdHJhY3RLZXlUcmVlTW9kZWwga2V5VHJlZU1vZGVsOworCisJcHJpdmF0ZSBJRmlsZSBmaWxlOyAvLyBpbml0CisKKwlwcml2YXRlIGJvb2xlYW4gdXBkYXRlU2VsZWN0ZWRLZXk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbXVsdGktcGFnZSBlZGl0b3IgZXhhbXBsZS4KKwkgKi8KKwlwdWJsaWMgTWVzc2FnZXNFZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCW91dGxpbmUgPSBuZXcgTWVzc2FnZXNCdW5kbGVHcm91cE91dGxpbmUodGhpcyk7CisJfQorCisJcHVibGljIE1lc3NhZ2VzRWRpdG9yTWFya2VycyBnZXRNYXJrZXJzKCkgeworCQlyZXR1cm4gbWFya2VyczsKKwl9CisKKwlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoZSA8Y29kZT5NdWx0aVBhZ2VFZGl0b3JFeGFtcGxlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAorCSAqIGNoZWNrcyB0aGF0IHRoZSBpbnB1dCBpcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JRmlsZUVkaXRvcklucHV0PC9jb2RlPi4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkKKwkgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7CisKKwkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgeworCQkJZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldEZpbGUoKTsKKwkJCWlmIChNc2dFZGl0b3JQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpCisJCQkgICAgICAgIC5pc0J1aWxkZXJTZXR1cEF1dG9tYXRpY2FsbHkoKSkgeworCQkJCUlQcm9qZWN0IHAgPSBmaWxlLmdldFByb2plY3QoKTsKKwkJCQlpZiAocCAhPSBudWxsICYmIHAuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQkJVG9nZ2xlTmF0dXJlQWN0aW9uCisJCQkJCSAgICAgICAgLmFkZE9yUmVtb3ZlTmF0dXJlT25Qcm9qZWN0KHAsIHRydWUsIHRydWUpOworCQkJCX0KKwkJCX0KKwkJCXRyeSB7CisJCQkJbWVzc2FnZXNCdW5kbGVHcm91cCA9IE1lc3NhZ2VzQnVuZGxlR3JvdXBGYWN0b3J5CisJCQkJICAgICAgICAuY3JlYXRlQnVuZGxlR3JvdXAoc2l0ZSwgZmlsZSk7CisJCQl9IGNhdGNoIChNZXNzYWdlRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgYnVuZGxlIGdyb3VwLiIsIGUpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQkvLyByZWdpc3RlciBidW5kbGUgZ3JvdXAgbGlzdGVuZXIgdG8gcmVmcmVzaCBlZGl0b3Igd2hlbiBuZXcgYSBidW5kbGUgaXMgYWRkZWQKKwkJCW1lc3NhZ2VzQnVuZGxlR3JvdXAuYWRkTWVzc2FnZXNCdW5kbGVHcm91cExpc3RlbmVyKG5ldyBNZXNzYWdlc0J1bmRsZUdyb3VwQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBtZXNzYWdlc0J1bmRsZUFkZGVkKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlKSB7CisJCQkJCWFkZE1lc3NhZ2VzQnVuZGxlKG1lc3NhZ2VzQnVuZGxlLCBtZXNzYWdlc0J1bmRsZS5nZXRMb2NhbGUoKSk7CisJCQkJCS8vIHJlZnJlc2ggaTE4biBwYWdlCisJCQkJCWkxOG5QYWdlLmFkZEkxOE5FbnRyeShNZXNzYWdlc0VkaXRvci50aGlzLCBtZXNzYWdlc0J1bmRsZS5nZXRMb2NhbGUoKSk7CisJCQkJfQorCQkJfSk7CisJCQltYXJrZXJzID0gbmV3IE1lc3NhZ2VzRWRpdG9yTWFya2VycyhtZXNzYWdlc0J1bmRsZUdyb3VwKTsKKwkJCXNldFBhcnROYW1lKG1lc3NhZ2VzQnVuZGxlR3JvdXAuZ2V0TmFtZSgpKTsKKwkJCXNldFRpdGxlSW1hZ2UoVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX1JFU09VUkNFX0JVTkRMRSkpOworCQkJY2xvc2VJZkFyZWFkeU9wZW4oc2l0ZSwgZmlsZSk7CisJCQlzdXBlci5pbml0KHNpdGUsIGVkaXRvcklucHV0KTsKKwkJCS8vIFRPRE8gZmlndXJlIG91dCBtb2RlbCB0byB1c2UgYmFzZWQgb24gcHJlZmVyZW5jZXMKKwkJCWtleVRyZWVNb2RlbCA9IG5ldyBBYnN0cmFjdEtleVRyZWVNb2RlbChtZXNzYWdlc0J1bmRsZUdyb3VwKTsKKwkJCS8vIG1hcmtlck1hbmFnZXIgPSBuZXcgUkJFTWFya2VyTWFuYWdlcih0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigKKwkJCSAgICAgICAgIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwkvLyBwdWJsaWMgUkJFTWFya2VyTWFuYWdlciBnZXRNYXJrZXJNYW5hZ2VyKCkgeworCS8vIHJldHVybiBtYXJrZXJNYW5hZ2VyOworCS8vIH0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKKwkJLy8gQ3JlYXRlIEkxOE4gcGFnZQorCQlpMThuUGFnZSA9IG5ldyBJMThOUGFnZShnZXRDb250YWluZXIoKSwgU1dULk5PTkUsIHRoaXMpOworCQlpbnQgaW5kZXggPSBhZGRQYWdlKGkxOG5QYWdlKTsKKwkJc2V0UGFnZVRleHQoaW5kZXgsIE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygiZWRpdG9yLnByb3BlcnRpZXMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc2V0UGFnZUltYWdlKGluZGV4LCBVSVV0aWxzLmdldEltYWdlKFVJVXRpbHMuSU1BR0VfUkVTT1VSQ0VfQlVORExFKSk7CisKKwkJLy8gQ3JlYXRlIHRleHQgZWRpdG9yIHBhZ2VzIGZvciBlYWNoIGxvY2FsZXMKKwkJTG9jYWxlW10gbG9jYWxlcyA9IG1lc3NhZ2VzQnVuZGxlR3JvdXAuZ2V0TG9jYWxlcygpOworCQkvLyBmaXJzdDogc29ydCB0aGUgbG9jYWxlcy4KKwkJVUlVdGlscy5zb3J0TG9jYWxlcyhsb2NhbGVzKTsKKwkJLy8gc2Vjb25kOiBmaWx0ZXIrc29ydCB0aGVtIGFjY29yZGluZyB0byB0aGUgZmlsdGVyIHByZWZlcmVuY2VzLgorCQlsb2NhbGVzID0gVUlVdGlscy5maWx0ZXJMb2NhbGVzKGxvY2FsZXMpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspIHsKKwkJCUxvY2FsZSBsb2NhbGUgPSBsb2NhbGVzW2ldOworCQkJTWVzc2FnZXNCdW5kbGUgbWVzc2FnZXNCdW5kbGUgPSAoTWVzc2FnZXNCdW5kbGUpIG1lc3NhZ2VzQnVuZGxlR3JvdXAKKwkJCSAgICAgICAgLmdldE1lc3NhZ2VzQnVuZGxlKGxvY2FsZSk7CisJCQlhZGRNZXNzYWdlc0J1bmRsZShtZXNzYWdlc0J1bmRsZSwgbG9jYWxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdGV4dCBlZGl0b3IgZm9yIHRoZSBtZXNzYWdlcyBidW5kbGUgYW5kIGxvY2FsZSwgd2hpY2ggZ2V0cyBhZGRlZCB0byBhIG5ldyBwYWdlCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZE1lc3NhZ2VzQnVuZGxlKE1lc3NhZ2VzQnVuZGxlIG1lc3NhZ2VzQnVuZGxlLCBMb2NhbGUgbG9jYWxlKSB7CisJCXRyeSB7CisJCQlJTWVzc2FnZXNSZXNvdXJjZSByZXNvdXJjZSA9IG1lc3NhZ2VzQnVuZGxlLmdldFJlc291cmNlKCk7CisJCQlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoVGV4dEVkaXRvcikgcmVzb3VyY2UuZ2V0U291cmNlKCk7CisJCQlpbnQgaW5kZXggPSBhZGRQYWdlKHRleHRFZGl0b3IsIHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQlzZXRQYWdlVGV4dChpbmRleCwKKwkJCSAgICAgICAgVUlVdGlscy5nZXREaXNwbGF5TmFtZShtZXNzYWdlc0J1bmRsZS5nZXRMb2NhbGUoKSkpOworCQkJc2V0UGFnZUltYWdlKGluZGV4LAorCQkJICAgICAgICBVSVV0aWxzLmdldEltYWdlKFVJVXRpbHMuSU1BR0VfUFJPUEVSVElFU19GSUxFKSk7CisJCQlsb2NhbGVzSW5kZXguYWRkKGxvY2FsZSk7CisJCQl0ZXh0RWRpdG9yc0luZGV4LmFkZCh0ZXh0RWRpdG9yKTsKKwkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNpdGUoKS5nZXRTaGVsbCgpLAorCQkJICAgICAgICAiRXJyb3IgY3JlYXRpbmcgdGV4dCBlZGl0b3IgcGFnZS4iLCAvLyROT04tTkxTLTEkCisJCQkgICAgICAgIG51bGwsIGUuZ2V0U3RhdHVzKCkpOworCQl9IAorCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgZWRpdG9yJ3MgcGFnZXMgbmVlZCB0byBiZSByZWxvYWRlZC4gRm9yIGV4YW1wbGUgd2hlbiB0aGUKKwkgKiBmaWx0ZXJzIG9mIGxvY2FsZSBpcyBjaGFuZ2VkLgorCSAqIDxwPgorCSAqIEN1cnJlbnRseSB0aGlzIG9ubHkgcmVsb2FkcyB0aGUgaW5kZXggcGFnZS4gVE9ETzogcmVtb3ZlIGFuZCBhZGQgdGhlIG5ldworCSAqIGxvY2FsZXM/IGl0IGFjdHVhbGx5IGxvb2tzIHF1aXRlIGhhcmQgdG8gZG8uCisJICogPC9wPgorCSAqLworCXB1YmxpYyB2b2lkIHJlbG9hZERpc3BsYXllZENvbnRlbnRzKCkgeworCQlzdXBlci5yZW1vdmVQYWdlKDApOworCQlpbnQgY3VycmVudGx5QWN0aXZlUGFnZSA9IHN1cGVyLmdldEFjdGl2ZVBhZ2UoKTsKKwkJaTE4blBhZ2UuZGlzcG9zZSgpOworCQlpMThuUGFnZSA9IG5ldyBJMThOUGFnZShnZXRDb250YWluZXIoKSwgU1dULk5PTkUsIHRoaXMpOworCQlzdXBlci5hZGRQYWdlKDAsIGkxOG5QYWdlKTsKKwkJaWYgKGN1cnJlbnRseUFjdGl2ZVBhZ2UgPT0gMCkgeworCQkJc3VwZXIuc2V0QWN0aXZlUGFnZShjdXJyZW50bHlBY3RpdmVQYWdlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNhdmVzIHRoZSBtdWx0aS1wYWdlIGVkaXRvcidzIGRvY3VtZW50LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJZm9yIChJVGV4dEVkaXRvciB0ZXh0RWRpdG9yIDogdGV4dEVkaXRvcnNJbmRleCkgeworCQkJdGV4dEVkaXRvci5kb1NhdmUobW9uaXRvcik7CisJCX0KKworCQl0cnkgeyAvLyBbYWxzdF0gcmVtb3ZlIGluIG5lYXIgZnV0dXJlCisJCQlUaHJlYWQuc2xlZXAoMjAwKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXVwZGF0ZVNlbGVjdGVkS2V5ID0gdHJ1ZTsKKworCQlSQk1hbmFnZXIgaW5zdGFuY2UgPSBSQk1hbmFnZXIuZ2V0SW5zdGFuY2UobWVzc2FnZXNCdW5kbGVHcm91cAorCQkgICAgICAgIC5nZXRQcm9qZWN0TmFtZSgpKTsKKworCQlyZWZyZXNoS2V5VHJlZU1vZGVsKCk7IC8vIGtlZXBzIGVkaXRvciBhbmQgSTE4TlBhZ2UgaW4gc3luYworCisJCWluc3RhbmNlLmZpcmVFZGl0b3JTYXZlZCgpOworCisJCS8vIC8vIG1heWJlIG5ldyBpbml0PworCX0KKworCXByaXZhdGUgdm9pZCByZWZyZXNoS2V5VHJlZU1vZGVsKCkgeworCQlTdHJpbmcgc2VsZWN0ZWRLZXkgPSBnZXRTZWxlY3RlZEtleSgpOyAvLyBtZW1vcml6ZQorCisJCWlmIChtZXNzYWdlc0J1bmRsZUdyb3VwID09IG51bGwpIHsKKwkJCW1lc3NhZ2VzQnVuZGxlR3JvdXAgPSBNZXNzYWdlc0J1bmRsZUdyb3VwRmFjdG9yeS5jcmVhdGVCdW5kbGVHcm91cCgKKwkJCSAgICAgICAgKElFZGl0b3JTaXRlKSBnZXRTaXRlKCksIGZpbGUpOworCQl9CisKKwkJQWJzdHJhY3RLZXlUcmVlTW9kZWwgb2xkTW9kZWwgPSB0aGlzLmtleVRyZWVNb2RlbDsKKwkJdGhpcy5rZXlUcmVlTW9kZWwgPSBuZXcgQWJzdHJhY3RLZXlUcmVlTW9kZWwobWVzc2FnZXNCdW5kbGVHcm91cCk7CisKKwkJZm9yIChJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgeworCQkJbGlzdGVuZXIua2V5VHJlZU1vZGVsQ2hhbmdlZChvbGRNb2RlbCwgdGhpcy5rZXlUcmVlTW9kZWwpOworCQl9CisKKwkJaTE4blBhZ2UuZ2V0VHJlZVZpZXdlcigpLmV4cGFuZEFsbCgpOworCisJCWlmIChzZWxlY3RlZEtleSAhPSBudWxsKSB7CisJCQlzZXRTZWxlY3RlZEtleShzZWxlY3RlZEtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgeworCQkvLyBTYXZlIEFzIG5vdCBhbGxvd2VkLgorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIENoYW5nZSBjdXJyZW50IHBhZ2UgYmFzZWQgb24gbG9jYWxlLiBJZiB0aGVyZSBpcyBubyBlZGl0b3JzIGFzc29jaWF0ZWQKKwkgKiB3aXRoIGN1cnJlbnQgbG9jYWxlLCBkbyBub3RoaW5nLgorCSAqIAorCSAqIEBwYXJhbSBsb2NhbGUKKwkgKiAgICAgICAgICAgIGxvY2FsZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBwYWdlIHRvIGNoYW5nZSB0bworCSAqLworCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoTG9jYWxlIGxvY2FsZSkgeworCQlpbnQgaW5kZXggPSBsb2NhbGVzSW5kZXguaW5kZXhPZihsb2NhbGUpOworCQlpZiAoaW5kZXggPiAtMSkgeworCQkJc2V0QWN0aXZlUGFnZShpbmRleCArIDEpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXIjZ290b01hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQorCSAqLworCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKKwkJLy8gU3RyaW5nIGtleSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoUkJFTWFya2VyLktFWSwgIiIpOworCQkvLyBpZiAoa2V5ICE9IG51bGwgJiYga2V5Lmxlbmd0aCgpID4gMCkgeworCQkvLyBzZXRBY3RpdmVQYWdlKDApOworCQkvLyBzZXRTZWxlY3RlZEtleShrZXkpOworCQkvLyBnZXRJMThOUGFnZSgpLnNlbGVjdExvY2FsZShCYWJlbFV0aWxzLnBhcnNlTG9jYWxlKAorCQkvLyBtYXJrZXIuZ2V0QXR0cmlidXRlKFJCRU1hcmtlci5MT0NBTEUsICIiKSkpOworCQkvLyB9IGVsc2UgeworCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKKwkJTG9jYWxlW10gbG9jYWxlcyA9IG1lc3NhZ2VzQnVuZGxlR3JvdXAuZ2V0TG9jYWxlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlNZXNzYWdlc1Jlc291cmNlIG1lc3NhZ2VzUmVzb3VyY2UgPSAoKE1lc3NhZ2VzQnVuZGxlKSBtZXNzYWdlc0J1bmRsZUdyb3VwCisJCQkgICAgICAgIC5nZXRNZXNzYWdlc0J1bmRsZShsb2NhbGVzW2ldKSkuZ2V0UmVzb3VyY2UoKTsKKwkJCWlmIChtZXNzYWdlc1Jlc291cmNlIGluc3RhbmNlb2YgRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZSkgeworCQkJCUVjbGlwc2VQcm9wZXJ0aWVzRWRpdG9yUmVzb3VyY2UgcHJvcEZpbGUgPSAoRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZSkgbWVzc2FnZXNSZXNvdXJjZTsKKwkJCQlpZiAocmVzb3VyY2UuZXF1YWxzKHByb3BGaWxlLmdldFJlc291cmNlKCkpKSB7CisJCQkJCS8vIG9rIHdlIGdvdCB0aGUgbG9jYWxlLgorCQkJCQkvLyB0cnkgdG8gb3BlbiB0aGUgbWFzdGVyIGkxOG4gcGFnZSBhbmQgc2VsZWN0IHRoZQorCQkJCQkvLyBjb3JyZXNwb25kaW5nIGtleS4KKwkJCQkJdHJ5IHsKKwkJCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBtYXJrZXIKKwkJCQkJCSAgICAgICAgLmdldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OKTsKKwkJCQkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkubGVuZ3RoKCkgPiAwKSB7CisJCQkJCQkJZ2V0STE4TlBhZ2UoKS5zZWxlY3RMb2NhbGUobG9jYWxlc1tpXSk7CisJCQkJCQkJc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJCQlzZXRTZWxlY3RlZEtleShrZXkpOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ly8gc29tZXRoaW5nIGJldHRlci5zCisJCQkJCX0KKwkJCQkJLy8gaXQgZGlkIG5vdCB3b3JrLi4uIGZhbGwgYmFjayB0byB0aGUgdGV4dCBlZGl0b3IuCisJCQkJCXNldEFjdGl2ZVBhZ2UobG9jYWxlc1tpXSk7CisJCQkJCUlERS5nb3RvTWFya2VyKChJRWRpdG9yUGFydCkgcHJvcEZpbGUuZ2V0U291cmNlKCksIG1hcmtlcik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyB9CisJfQorCisJLyoqCisJICogQ2FsY3VsYXRlcyB0aGUgY29udGVudHMgb2YgcGFnZSBHVUkgcGFnZSB3aGVuIGl0IGlzIGFjdGl2YXRlZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKKwkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOworCQlpZiAobmV3UGFnZUluZGV4ICE9IDApIHsgLy8gaWYgd2UganVzdCB3YW50IHRoZSBkZWZhdWx0IHBhZ2UgLT4gPT0gMQorCQkJc2V0U2VsZWN0aW9uKG5ld1BhZ2VJbmRleCk7CisJCX0gZWxzZSBpZiAobmV3UGFnZUluZGV4ID09IDAgJiYgdXBkYXRlU2VsZWN0ZWRLZXkpIHsKKwkJCS8vIFRPRE86IGZpbmQgYmV0dGVyIHdheQorCQkJZm9yIChJTWVzc2FnZXNCdW5kbGUgYnVuZGxlIDogbWVzc2FnZXNCdW5kbGVHcm91cAorCQkJICAgICAgICAuZ2V0TWVzc2FnZXNCdW5kbGVzKCkpIHsKKwkJCQlSQk1hbmFnZXIuZ2V0SW5zdGFuY2UobWVzc2FnZXNCdW5kbGVHcm91cC5nZXRQcm9qZWN0TmFtZSgpKQorCQkJCSAgICAgICAgLmZpcmVSZXNvdXJjZUNoYW5nZWQoYnVuZGxlKTsKKwkJCX0KKwkJCXVwZGF0ZVNlbGVjdGVkS2V5ID0gZmFsc2U7CisJCX0KKworCQkvLyBpZiAobmV3UGFnZUluZGV4ID09IDApIHsKKwkJLy8gcmVzb3VyY2VNZWRpYXRvci5yZWxvYWRQcm9wZXJ0aWVzKCk7CisJCS8vIGkxOG5QYWdlLnJlZnJlc2hUZXh0Qm94ZXMoKTsKKwkJLy8gfQorCX0KKworCXByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb24oaW50IG5ld1BhZ2VJbmRleCkgeworCQlJVGV4dEVkaXRvciBlZGl0b3IgPSB0ZXh0RWRpdG9yc0luZGV4LmdldCgtLW5ld1BhZ2VJbmRleCk7CisJCVN0cmluZyBzZWxlY3RlZEtleSA9IGdldFNlbGVjdGVkS2V5KCk7CisJCWlmIChzZWxlY3RlZEtleSAhPSBudWxsKSB7CisJCQlpZiAoZWRpdG9yLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKKwkJCQlGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRmlsZUVkaXRvcklucHV0KSBlZGl0b3IKKwkJCQkgICAgICAgIC5nZXRFZGl0b3JJbnB1dCgpOworCQkJCXRyeSB7CisJCQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQkJICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXQuZ2V0RmlsZSgpLmdldENvbnRlbnRzKCkpKTsKKwkJCQkJU3RyaW5nIGxpbmUgPSAiIjsKKwkJCQkJaW50IHNlbGVjdGlvbkluZGV4ID0gMDsKKwkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCisJCQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQkJCQlpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoJz0nKTsKKwkJCQkJCWlmIChpbmRleCAhPSAtMSkgeworCQkJCQkJCWlmIChzZWxlY3RlZEtleS5lcXVhbHMobGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpCisJCQkJCQkJICAgICAgICAudHJpbSgpKSkgeworCQkJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCXNlbGVjdGlvbkluZGV4ICs9IGxpbmUubGVuZ3RoKCkgKyAyOyAvLyArIFxyXG4KKwkJCQkJfQorCisJCQkJCWlmIChmb3VuZCkgeworCQkJCQkJZWRpdG9yLnNlbGVjdEFuZFJldmVhbChzZWxlY3Rpb25JbmRleCwgMCk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCS8qKgorCSAqIElzIHRoZSBnaXZlbiBmaWxlIGEgbWVtYmVyIG9mIHRoaXMgcmVzb3VyY2UgYnVuZGxlLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlCisJICogICAgICAgICAgICBmaWxlIHRvIHRlc3QKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpbGUgaXMgcGFydCBvZiBidW5kbGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0J1bmRsZU1lbWJlcihJRmlsZSBmaWxlKSB7CisJCS8vIHJldHVybiByZXNvdXJjZU1lZGlhdG9yLmlzUmVzb3VyY2UoZmlsZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2xvc2VJZkFyZWFkeU9wZW4oSUVkaXRvclNpdGUgc2l0ZSwgSUZpbGUgZmlsZSkgeworCQlJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYWdlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7CisJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gcGFnZXNbaV07CisJCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9ycyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlZGl0b3JzLmxlbmd0aDsgaisrKSB7CisJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yc1tqXS5nZXRFZGl0b3IoZmFsc2UpOworCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXNzYWdlc0VkaXRvcikgeworCQkJCQlNZXNzYWdlc0VkaXRvciByYmUgPSAoTWVzc2FnZXNFZGl0b3IpIGVkaXRvcjsKKwkJCQkJaWYgKHJiZS5pc0J1bmRsZU1lbWJlcihmaWxlKSkgeworCQkJCQkJcGFnZS5jbG9zZUVkaXRvcihlZGl0b3IsIHRydWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlmb3IgKElNZXNzYWdlc0VkaXRvckNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5lZGl0b3JEaXNwb3NlZCgpOworCQl9CisJCWkxOG5QYWdlLmRpc3Bvc2UoKTsKKwkJZm9yIChJVGV4dEVkaXRvciB0ZXh0RWRpdG9yIDogdGV4dEVkaXRvcnNJbmRleCkgeworCQkJdGV4dEVkaXRvci5kaXNwb3NlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGVkS2V5LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRLZXkoKSB7CisJCXJldHVybiBzZWxlY3RlZEtleTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2VsZWN0ZWRLZXkKKwkgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZEtleSB0byBzZXQuCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRLZXkoU3RyaW5nIGFjdGl2ZUtleSkgeworCQlpZiAoKHNlbGVjdGVkS2V5ID09IG51bGwgJiYgYWN0aXZlS2V5ICE9IG51bGwpCisJCSAgICAgICAgfHwgKHNlbGVjdGVkS2V5ICE9IG51bGwgJiYgYWN0aXZlS2V5ID09IG51bGwpCisJCSAgICAgICAgfHwgKHNlbGVjdGVkS2V5ICE9IG51bGwgJiYgIXNlbGVjdGVkS2V5LmVxdWFscyhhY3RpdmVLZXkpKSkgeworCQkJU3RyaW5nIG9sZEtleSA9IHRoaXMuc2VsZWN0ZWRLZXk7CisJCQl0aGlzLnNlbGVjdGVkS2V5ID0gYWN0aXZlS2V5OworCQkJZm9yIChJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgeworCQkJCWxpc3RlbmVyLnNlbGVjdGVkS2V5Q2hhbmdlZChvbGRLZXksIGFjdGl2ZUtleSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQljaGFuZ2VMaXN0ZW5lcnMuYWRkKDAsIGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQljaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgQ29sbGVjdGlvbjxJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lcj4gZ2V0Q2hhbmdlTGlzdGVuZXJzKCkgeworCQlyZXR1cm4gY2hhbmdlTGlzdGVuZXJzOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWVzc2FnZXNCdW5kbGVHcm91cC4KKwkgKi8KKwlwdWJsaWMgTWVzc2FnZXNCdW5kbGVHcm91cCBnZXRCdW5kbGVHcm91cCgpIHsKKwkJcmV0dXJuIG1lc3NhZ2VzQnVuZGxlR3JvdXA7CisJfQorCisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXlUcmVlTW9kZWwuCisJICovCisJcHVibGljIEFic3RyYWN0S2V5VHJlZU1vZGVsIGdldEtleVRyZWVNb2RlbCgpIHsKKwkJcmV0dXJuIGtleVRyZWVNb2RlbDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5VHJlZU1vZGVsCisJICogICAgICAgICAgICBUaGUga2V5VHJlZU1vZGVsIHRvIHNldC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRLZXlUcmVlTW9kZWwoQWJzdHJhY3RLZXlUcmVlTW9kZWwgbmV3S2V5VHJlZU1vZGVsKSB7CisJCWlmICgodGhpcy5rZXlUcmVlTW9kZWwgPT0gbnVsbCAmJiBuZXdLZXlUcmVlTW9kZWwgIT0gbnVsbCkKKwkJICAgICAgICB8fCAoa2V5VHJlZU1vZGVsICE9IG51bGwgJiYgbmV3S2V5VHJlZU1vZGVsID09IG51bGwpCisJCSAgICAgICAgfHwgKCFrZXlUcmVlTW9kZWwuZXF1YWxzKG5ld0tleVRyZWVNb2RlbCkpKSB7CisJCQlBYnN0cmFjdEtleVRyZWVNb2RlbCBvbGRNb2RlbCA9IHRoaXMua2V5VHJlZU1vZGVsOworCQkJdGhpcy5rZXlUcmVlTW9kZWwgPSBuZXdLZXlUcmVlTW9kZWw7CisJCQlmb3IgKElNZXNzYWdlc0VkaXRvckNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7CisJCQkJbGlzdGVuZXIua2V5VHJlZU1vZGVsQ2hhbmdlZChvbGRNb2RlbCwgbmV3S2V5VHJlZU1vZGVsKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBJMThOUGFnZSBnZXRJMThOUGFnZSgpIHsKKwkJcmV0dXJuIGkxOG5QYWdlOworCX0KKworCS8qKgorCSAqIG9uZSBvZiB0aGUgU0hPV18qIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoZQorCSAqIHtAbGluayBJTWVzc2FnZXNFZGl0b3JDaGFuZ2VMaXN0ZW5lcn0KKwkgKi8KKwlwcml2YXRlIGludCBzaG93T25seU1pc3NpbmdBbmRVbnVzZWRLZXlzID0gSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIuU0hPV19BTEw7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgd2hlbiBvbmx5IHVudXNlZCBhbmQgbWlzc2luZyBrZXlzIHNob3VsZCBiZSBkaXNwbGF5ZWQuIGZsYXNlCisJICogICAgICAgICBieSBkZWZhdWx0LgorCSAqLworCXB1YmxpYyBpbnQgaXNTaG93T25seVVudXNlZEFuZE1pc3NpbmdLZXlzKCkgeworCQlyZXR1cm4gc2hvd09ubHlNaXNzaW5nQW5kVW51c2VkS2V5czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTaG93T25seVVudXNlZE1pc3NpbmdLZXlzKGludCBzaG93RmxhZykgeworCQlzaG93T25seU1pc3NpbmdBbmRVbnVzZWRLZXlzID0gc2hvd0ZsYWc7CisJCWZvciAoSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBnZXRDaGFuZ2VMaXN0ZW5lcnMoKSkgeworCQkJbGlzdGVuZXIuc2hvd09ubHlVbnVzZWRBbmRNaXNzaW5nQ2hhbmdlZChzaG93RmxhZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQlPYmplY3Qgb2JqID0gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKKwkJaWYgKG9iaiA9PSBudWxsKSB7CisJCQlpZiAoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKKwkJCQlyZXR1cm4gKG91dGxpbmUpOworCQkJfQorCQl9CisJCXJldHVybiAob2JqKTsKKwl9CisKKwlwdWJsaWMgSVRleHRFZGl0b3IgZ2V0VGV4dEVkaXRvcihMb2NhbGUgbG9jYWxlKSB7CisJCWludCBpbmRleCA9IGxvY2FsZXNJbmRleC5pbmRleE9mKGxvY2FsZSk7CisJCXJldHVybiB0ZXh0RWRpdG9yc0luZGV4LmdldChpbmRleCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvTWVzc2FnZXNFZGl0b3JDaGFuZ2VBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pbnRlcm5hbC9NZXNzYWdlc0VkaXRvckNoYW5nZUFkYXB0ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9NZXNzYWdlc0VkaXRvckNoYW5nZUFkYXB0ZXIuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaW50ZXJuYWwvTWVzc2FnZXNFZGl0b3JDaGFuZ2VBZGFwdGVyLmphdmEKaW5kZXggOTNmMjU4My4uNzIxZDEyMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvTWVzc2FnZXNFZGl0b3JDaGFuZ2VBZGFwdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaW50ZXJuYWwvTWVzc2FnZXNFZGl0b3JDaGFuZ2VBZGFwdGVyLmphdmEKQEAgLTgsOSArOCwxMCBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWw7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5BYnN0cmFjdEtleVRyZWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5BYnN0cmFjdEtleVRyZWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI7CiAKIC8qKgogICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlCkBAIC00Niw3ICs0Nyw3IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlscHNlLmJhYmVsLmVkaXRvci5lZGl0b3IuSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIja2V5VHJlZU1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZU1vZGVsLCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZU1vZGVsKQorICAgICAqIEBzZWUgb3JnLmVjbGlscHNlLmJhYmVsLmVkaXRvci5lZGl0b3IuSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXIja2V5VHJlZU1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwudHJlZS5pbnRlcm5hbC5JS2V5VHJlZU1vZGVsLCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwudHJlZS5pbnRlcm5hbC5JS2V5VHJlZU1vZGVsKQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGtleVRyZWVNb2RlbENoYW5nZWQoQWJzdHJhY3RLZXlUcmVlTW9kZWwgb2xkTW9kZWwsIEFic3RyYWN0S2V5VHJlZU1vZGVsIG5ld01vZGVsKSB7CiAgICAgICAgIC8vIGRvIG5vdGhpbmcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL01lc3NhZ2VzRWRpdG9yQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2ludGVybmFsL01lc3NhZ2VzRWRpdG9yQ29udHJpYnV0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9NZXNzYWdlc0VkaXRvckNvbnRyaWJ1dG9yLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2ludGVybmFsL01lc3NhZ2VzRWRpdG9yQ29udHJpYnV0b3IuamF2YQppbmRleCA0MWFhM2YwLi40OGJmNmJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9NZXNzYWdlc0VkaXRvckNvbnRyaWJ1dG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaW50ZXJuYWwvTWVzc2FnZXNFZGl0b3JDb250cmlidXRvci5qYXZhCkBAIC04LDggKzgsOSBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmFjdGlvbnMuRmlsdGVyS2V5c0FjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuYWN0aW9ucy5LZXlUcmVlVmlzaWJsZUFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuYWN0aW9ucy5OZXdMb2NhbGVBY3Rpb247CkBAIC0xNzMsNiArMTc0LDcgQEAKIAkJCT8gKE1lc3NhZ2VzRWRpdG9yKXBhcnQgOiBudWxsOwogICAgICAgICB0b2dnbGVLZXlUcmVlQWN0aW9uLnNldEVkaXRvcihtZSk7CiAgICAgICAgICgoRmlsdGVyS2V5c0FjdGlvbkdyb3VwKSBGSUxURVJTKS5zZXRBY3RpdmVFZGl0b3IocGFydCk7CisgICAgICAgIG5ld0xvY2FsZUFjdGlvbi5zZXRFZGl0b3IobWUpOwogICAgIH0KICAgICAKICAgICAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL01lc3NhZ2VzRWRpdG9yTWFya2Vycy5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaW50ZXJuYWwvTWVzc2FnZXNFZGl0b3JNYXJrZXJzLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvTWVzc2FnZXNFZGl0b3JNYXJrZXJzLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2ludGVybmFsL01lc3NhZ2VzRWRpdG9yTWFya2Vycy5qYXZhCmluZGV4IGU2NzdlYzguLmY2OWMzNDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL01lc3NhZ2VzRWRpdG9yTWFya2Vycy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2ludGVybmFsL01lc3NhZ2VzRWRpdG9yTWFya2Vycy5qYXZhCkBAIC04LDcgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC0xOCwxMSArMTgsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5PYnNlcnZhYmxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLklNZXNzYWdlQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5NaXNzaW5nVmFsdWVDaGVjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLmludGVybmFsLkR1cGxpY2F0ZVZhbHVlQ2hlY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5pbnRlcm5hbC5NaXNzaW5nVmFsdWVDaGVjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXBBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yZXNvdXJjZS52YWxpZGF0b3IuSVZhbGlkYXRpb25NYXJrZXJTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmVzb3VyY2UudmFsaWRhdG9yLk1lc3NhZ2VzQnVuZGxlR3JvdXBWYWxpZGF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJlc291cmNlLnZhbGlkYXRvci5WYWxpZGF0aW9uRmFpbHVyZUV2ZW50OwpAQCAtMTczLDYgKzE3NCwxNSBAQAogICAgIAogICAgIC8qKgogICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUga2V5IGhhcyBhIG1pc3NpbmcgaXNzdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01pc3NpbmdLZXkoU3RyaW5nIGtleSkgeworICAgIAlDb2xsZWN0aW9uPElNZXNzYWdlQ2hlY2s+IG1hcmtlcnMgPSBnZXRGYWlsZWRDaGVja3Moa2V5KTsKKyAgICAJcmV0dXJuIG1hcmtlcnMgIT0gbnVsbCAmJiBtYXJrZXJzQ29udGFpbk1pc3NpbmcobWFya2Vycyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBrZXkKICAgICAgKiBAcGFyYW0gaXNNaXNzaW5nT3JVbnVzZWQgdHJ1ZSB3aGVuIGl0IGhhcyBiZWVuIGFzc2VzZWQgYWxyZWFkeQogICAgICAqIHRoYXQgaXQgaXMgbWlzc2luZyBvciB1bnVzZWQKICAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUga2V5IGlzIHVudXNlZApAQCAtMTkwLDYgKzIwMCwyMSBAQAogICAgIAlyZXR1cm4gbWFya2VycyAhPSBudWxsICYmIG1hcmtlcnNDb250YWluTWlzc2luZyhtYXJrZXJzKTsKICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSB2YWx1ZSBpcyBhIGR1cGxpY2F0ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRHVwbGljYXRlVmFsdWUoU3RyaW5nIGtleSkgeworICAgIAlDb2xsZWN0aW9uPElNZXNzYWdlQ2hlY2s+IG1hcmtlcnMgPSBnZXRGYWlsZWRDaGVja3Moa2V5KTsKKyAgICAJZm9yIChJTWVzc2FnZUNoZWNrIG1hcmtlciA6IG1hcmtlcnMpIHsKKyAgICAJCWlmIChtYXJrZXIgaW5zdGFuY2VvZiBEdXBsaWNhdGVWYWx1ZUNoZWNrKSB7CisgICAgCQkJcmV0dXJuIHRydWU7CisgICAgCQl9CisgICAgCX0KKyAgICAJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKICAgICBwcml2YXRlIGJvb2xlYW4gbWFya2Vyc0NvbnRhaW5NaXNzaW5nKENvbGxlY3Rpb248SU1lc3NhZ2VDaGVjaz4gbWFya2VycykgewogICAgIAlmb3IgKElNZXNzYWdlQ2hlY2sgbWFya2VyIDogbWFya2VycykgewogICAgIAkJaWYgKG1hcmtlciA9PSBNaXNzaW5nVmFsdWVDaGVjay5NSVNTSU5HX0tFWSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcGx1Z2luL01lc3NhZ2VzRWRpdG9yUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wbHVnaW4vTWVzc2FnZXNFZGl0b3JQbHVnaW4uamF2YQppbmRleCBjZDcxZjc1Li40NmU2YTZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wbHVnaW4vTWVzc2FnZXNFZGl0b3JQbHVnaW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wbHVnaW4vTWVzc2FnZXNFZGl0b3JQbHVnaW4uamF2YQpAQCAtMjAsOSArMjAsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuQWJzdHJhY3RJRmlsZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5BYnN0cmFjdElGaWxlQ2hhbmdlTGlzdGVuZXIuSUZpbGVDaGFuZ2VMaXN0ZW5lclJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5BYnN0cmFjdElGaWxlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLkFic3RyYWN0SUZpbGVDaGFuZ2VMaXN0ZW5lci5JRmlsZUNoYW5nZUxpc3RlbmVyUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmJ1aWxkZXIuVG9nZ2xlTmF0dXJlQWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wcmVmZXJlbmNlcy5Nc2dFZGl0b3JQcmVmZXJlbmNlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CkBAIC0zNiw2ICszNywxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkubW9kZWwuUmVzb3VyY2VCdW5kbGVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwogaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwogCkBAIC03Nyw2ICs4NCw0OSBAQAogCXB1YmxpYyBNZXNzYWdlc0VkaXRvclBsdWdpbigpIHsKIAkJcmVzb3VyY2VDaGFuZ2VTdWJzY3JpYmVycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTZXQ8QWJzdHJhY3RJRmlsZUNoYW5nZUxpc3RlbmVyPj4oKTsKIAl9CisJCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVW5kb0tleUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgeworICAgIAorICAgIAlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworICAgIAkJQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBldmVudC5kaXNwbGF5LmdldEZvY3VzQ29udHJvbCgpOworICAgIAkJaWYgKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ09OVFJPTCAmJiBmb2N1c0NvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgCQkJCisgICAgCQkJVGV4dCB0eHQgPSAoVGV4dCkgZm9jdXNDb250cm9sOworICAgIAkJCVN0cmluZyBhY3RUZXh0ID0gdHh0LmdldFRleHQoKTsKKyAgICAJCQlTdGFjazxTdHJpbmc+IHVuZG9TdGFjayA9IChTdGFjazxTdHJpbmc+KSB0eHQuZ2V0RGF0YSgiVU5ETyIpOworCQkJCVN0YWNrPFN0cmluZz4gcmVkb1N0YWNrID0gKFN0YWNrPFN0cmluZz4pIHR4dC5nZXREYXRhKCJSRURPIik7CisJCQkJCisgICAgCQkJaWYgKGV2ZW50LmtleUNvZGUgPT0gJ3onICYmIHVuZG9TdGFjayAhPSBudWxsICYmIHJlZG9TdGFjayAhPSBudWxsKSB7IC8vIFVuZG8KKyAgICAJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOworICAgIAkJCQkKKyAgICAJCQkJaWYgKHVuZG9TdGFjay5zaXplKCkgPiAwKSB7CisgICAgCQkJCQlTdHJpbmcgcGVlayA9IHVuZG9TdGFjay5wZWVrKCk7CisgICAgCQkJCQlpZiAoYWN0VGV4dCAhPSBudWxsICYmICF0eHQuZ2V0VGV4dCgpLmVxdWFscyhwZWVrKSkgeworICAgIAkJCQkJCVN0cmluZyBwb3AgPSB1bmRvU3RhY2sucG9wKCk7CisJICAgIAkJCQkJdHh0LnNldFRleHQocG9wKTsKKwkgICAgCQkJCQl0eHQuc2V0U2VsZWN0aW9uKHBvcC5sZW5ndGgoKSk7CisJICAgIAkJCQkJcmVkb1N0YWNrLnB1c2goYWN0VGV4dCk7CisgICAgCQkJCQl9CisgICAgCQkJCX0KKyAgICAJCQl9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT0gJ3knICYmIHVuZG9TdGFjayAhPSBudWxsICYmIHJlZG9TdGFjayAhPSBudWxsKSB7IC8vIFJlZG8KKyAgICAJCQkJCisgICAgCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKKyAgICAJCQkJCisgICAgCQkJCWlmIChyZWRvU3RhY2suc2l6ZSgpID4gMCkgeworICAgIAkJCQkJU3RyaW5nIHBlZWsgPSByZWRvU3RhY2sucGVlaygpOworICAgIAkJCQkJCisgICAgCQkJCQlpZiAoYWN0VGV4dCAhPSBudWxsICYmICF0eHQuZ2V0VGV4dCgpLmVxdWFscyhwZWVrKSkgeworICAgIAkJCQkJCVN0cmluZyBwb3AgPSByZWRvU3RhY2sucG9wKCk7CisJICAgIAkJCQkJdHh0LnNldFRleHQocG9wKTsKKwkgICAgCQkJCQl0eHQuc2V0U2VsZWN0aW9uKHBvcC5sZW5ndGgoKSk7CisJICAgIAkJCQkJdW5kb1N0YWNrLnB1c2goYWN0VGV4dCk7CisgICAgCQkJCQl9CisgICAgCQkJCX0KKyAgICAJCQl9CisgICAgCQl9CisgICAgCX0KKyAgICAJCisgICAgfQogCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydCgKQEAgLTEyMSw2ICsxNzEsMTQgQEAKICAgICAgICAgCX0KICAgICAgICAgfTsKICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIAorICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYWRkRmlsdGVyKFNXVC5LZXlVcCwgbmV3IFVuZG9LZXlMaXN0ZW5lcigpKTsKKwkJCQkKKwkJCX0KKwkJfSk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wcmVmZXJlbmNlcy9HZW5lcmFsUHJlZlBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL0dlbmVyYWxQcmVmUGFnZS5qYXZhCmluZGV4IDA0NzFiM2MuLjE5NGE2NzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL0dlbmVyYWxQcmVmUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL0dlbmVyYWxQcmVmUGFnZS5qYXZhCkBAIC03MCw3ICs3MCw3IEBACiAgICAgICAgIG5ldyBMYWJlbChmaWVsZCwgU1dULk5PTkUpLnNldFRleHQoCiAgICAgICAgICAgICAgICAgTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0U3RyaW5nKCJwcmVmcy5ncm91cFNlcCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICBrZXlHcm91cFNlcGFyYXRvciA9IG5ldyBUZXh0KGZpZWxkLCBTV1QuQk9SREVSKTsKLSAgICAgICAga2V5R3JvdXBTZXBhcmF0b3Iuc2V0VGV4dChwcmVmcy5nZXRHcm91cExldmVsU2VwYXJhdG9yKCkpOworICAgICAgICBrZXlHcm91cFNlcGFyYXRvci5zZXRUZXh0KHByZWZzLmdldFNlcmlhbGl6ZXJDb25maWcoKS5nZXRHcm91cExldmVsU2VwYXJhdG9yKCkpOwogLy8gICAgICAgICAgICAgICAgcHJlZnMuZ2V0U3RyaW5nKE1zZ0VkaXRvclByZWZlcmVuY2VzLkdST1VQX19MRVZFTF9TRVBBUkFUT1IpKTsKICAgICAgICAga2V5R3JvdXBTZXBhcmF0b3Iuc2V0VGV4dExpbWl0KDIpOwogICAgICAgICAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgZmllbGQgPSBjcmVhdGVGaWVsZENvbXBvc2l0ZShjb21wb3NpdGUpOwogICAgICAgICBjb252ZXJ0RW5jb2RlZFRvVW5pY29kZSA9IG5ldyBCdXR0b24oZmllbGQsIFNXVC5DSEVDSyk7CiAgICAgICAgIGNvbnZlcnRFbmNvZGVkVG9Vbmljb2RlLnNldFNlbGVjdGlvbigKLSAgICAgICAgICAgICAgICBwcmVmcy5pc1VuaWNvZGVFc2NhcGVFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIHByZWZzLmdldFNlcmlhbGl6ZXJDb25maWcoKS5pc1VuaWNvZGVFc2NhcGVFbmFibGVkKCkpOwogLy8gICAgICAgICAgICAgICAgcHJlZnMuZ2V0Qm9vbGVhbihNc2dFZGl0b3JQcmVmZXJlbmNlcy5DT05WRVJUX0VOQ09ERURfVE9fVU5JQ09ERSkpOwogICAgICAgICBuZXcgTGFiZWwoZmllbGQsIFNXVC5OT05FKS5zZXRUZXh0KAogICAgICAgICAgICAgICAgIE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygicHJlZnMuY29udmVydEVuY29kZWQiKSk7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL01zZ0VkaXRvclByZWZlcmVuY2VzLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wcmVmZXJlbmNlcy9Nc2dFZGl0b3JQcmVmZXJlbmNlcy5qYXZhCmluZGV4IDk3NTdjN2IuLjQzZDc4OWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL01zZ0VkaXRvclByZWZlcmVuY2VzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcHJlZmVyZW5jZXMvTXNnRWRpdG9yUHJlZmVyZW5jZXMuamF2YQpAQCAtNyw2ICs3LDggQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBBbGV4ZWogU3RyZWx6b3cgLSBleHRlcm5hbGl6ZWQgSVByb3BlcnRpZXNTZXJpYWxpemVyQ29uZmlnIGFuZCAKKyAqICAgIAkJCQkJSVByb3BlcnRpZXNEZXNlcmlhbGl6ZXJDb25maWcgZm9yIGJldHRlciByZXVzZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnByZWZlcmVuY2VzOwogCkBAIC0xNSw5ICsxNyw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5JUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLklQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5idWlsZGVyLkJ1aWxkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmJ1aWxkZXIuVG9nZ2xlTmF0dXJlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pbnRlcm5hbC5NZXNzYWdlc0VkaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwpAQCAtMjcsOCArMjksOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwpAQCAtNDEsNyArNDMsNyBAQAogICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlIChwYXNjYWxAZXNzaWVtYnJlLmNvbSkKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1zZ0VkaXRvclByZWZlcmVuY2VzCi0gICAgICAgIGltcGxlbWVudHMgSVByb3BlcnRpZXNTZXJpYWxpemVyQ29uZmlnLCBJUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZywgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworICAgICAgICBpbXBsZW1lbnRzIC8qSVByb3BlcnRpZXNTZXJpYWxpemVyQ29uZmlnLCBJUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZywqLyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CiAgICAKIAkvKiogdGhlIGNvcnJlc3BvbmRpbmcgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggc3VjaCBhIHByZWZlcmVuY2Ugc2hvdWxkCiAJICogbm90IGJlIGdlbmVyYXRlZCAqLwpAQCAtMjAyLDYgKzIwNCwxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1zZ0VkaXRvclByZWZlcmVuY2VzIElOU1RBTkNFID0KICAgICAgICAgICAgICAgICBuZXcgTXNnRWRpdG9yUHJlZmVyZW5jZXMoKTsKICAgICAKKyAgICBwcml2YXRlIGZpbmFsIElQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZyBzZXJpYWxpemVyQ29uZmlnID0gbmV3IFByb3BlcnRpZXNTZXJpYWxpemVyQ29uZmlnKCk7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBJUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZyBkZXNlcmlhbGl6ZXJDb25maWcgPSBuZXcgUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZygpOworICAgIAogICAgIHByaXZhdGUgU3RyaW5nTWF0Y2hlcltdIGNhY2hlZENvbXBpbGVkTG9jYWxlRmlsdGVyOwogICAgIAogICAgIC8qKgpAQCAtMjE1LDE1ICsyMjEsMTYgQEAKICAgICAgICAgcmV0dXJuIElOU1RBTkNFOwogICAgIH0KICAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGtleSBncm91cCBzZXBhcmF0b3IuCi0gICAgICogQHJldHVybiBrZXkgZ3JvdXAgc2VwYXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBMZXZlbFNlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIFBSRUZTLmdldFN0cmluZyhHUk9VUF9fTEVWRUxfU0VQQVJBVE9SKTsKLSAgICB9CisgICAgCisgICAgcHVibGljIElQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZyBnZXRTZXJpYWxpemVyQ29uZmlnKCkgeworCQlyZXR1cm4gc2VyaWFsaXplckNvbmZpZzsKKwl9CiAKLSAgICAvKioKKwlwdWJsaWMgSVByb3BlcnRpZXNEZXNlcmlhbGl6ZXJDb25maWcgZ2V0RGVzZXJpYWxpemVyQ29uZmlnKCkgeworCQlyZXR1cm4gZGVzZXJpYWxpemVyQ29uZmlnOworCX0KKworCS8qKgogICAgICAqIEdldHMgd2hldGhlciBwcmVzc2luZyB0YWIgaW5zZXJ0cyBhIHRhYiBpbiBhIGZpZWxkLgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJlc3NpbmcgdGFiIGluc2VydHMgYSB0YWIgaW4gYSBmaWVsZAogICAgICAqLwpAQCAtMjMyLDU2ICsyMzksNiBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgZXF1YWxzIHNpZ25zIHNob3VsZCBiZSBhbGlnbmVkIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXF1YWxzIHNpZ25zIHNob3VsZCBiZSBhbGlnbmVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGlnbkVxdWFsc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKEFMSUdOX0VRVUFMU19FTkFCTEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlcmUgc2hvdWxkIGJlIHNwYWNlcyBhcm91bmQgZXF1YWxzIHNpZ25zIHdoZW4gZ2VuZXJhdGluZyAKLSAgICAgKiBmaWxlLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdGhlcmUgaWYgc2hvdWxkIGJlIHNwYWNlcyBhcm91bmQgZXF1YWxzIHNpZ25zCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTcGFjZXNBcm91bmRFcXVhbHNFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihTUEFDRVNfQVJPVU5EX0VRVUFMU19FTkFCTEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIga2V5cyBzaG91bGQgYmUgZ3JvdXBlZCB3aGVuIGdlbmVyYXRpbmcgZmlsZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGtleXMgc2hvdWxkIGJlIGdyb3VwZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dyb3VwS2V5c0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKEdST1VQX0tFWVNfRU5BQkxFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBob3cgbWFueSBsZXZlbCBkZWVwIGtleXMgc2hvdWxkIGJlIGdyb3VwZWQgd2hlbiBnZW5lcmF0aW5nIGZpbGUuCi0gICAgICogQHJldHVybiBob3cgbWFueSBsZXZlbCBkZWVwCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRHcm91cExldmVsRGVwdGgoKSB7Ci0gICAgICAgIHJldHVybiBQUkVGUy5nZXRJbnQoR1JPVVBfTEVWRUxfREVFUCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgaG93IG1hbnkgYmxhbmsgbGluZXMgc2hvdWxkIHNlcGFyYXRlIGdyb3VwcyB3aGVuIGdlbmVyYXRpbmcgZmlsZS4KLSAgICAgKiBAcmV0dXJuIGhvdyBtYW55IGJsYW5rIGxpbmVzIGJldHdlZW4gZ3JvdXBzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRHcm91cFNlcEJsYW5rTGluZUNvdW50KCkgewotICAgICAgICByZXR1cm4gUFJFRlMuZ2V0SW50KEdST1VQX1NFUF9CTEFOS19MSU5FX0NPVU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgZXF1YWwgc2lnbnMgc2hvdWxkIGJlIGFsaWduZWQgd2l0aGluIGVhY2ggZ3JvdXBzIHdoZW4KLSAgICAgKiBnZW5lcmF0aW5nIGZpbGUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlcXVhbCBzaWducyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoaW4gZ3JvdXBzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHcm91cEFsaWduRXF1YWxzRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oR1JPVVBfQUxJR05fRVFVQUxTX0VOQUJMRUQpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldHMgd2hldGhlciBrZXkgdHJlZSBzaG91bGQgYmUgZGlzcGxheWVkIGluIGhpZWFyY2hpY2FsIHdheSBieSBkZWZhdWx0LgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaGllcmFyY2hpY2FsCiAgICAgICovCkBAIC0yOTcsMTQgKzI1NCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIHRvIHByaW50ICJHZW5lcmF0ZWQgQnkuLi4iIGNvbW1lbnQgd2hlbiBnZW5lcmF0aW5nIGZpbGUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB3ZSBwcmludCBpdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd1N1cHBvcnRFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihTSE9XX1NVUFBPUlRfRU5BQkxFRCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0cyB3aGV0aGVyIHRvIHN1cHBvcnQgRWNsaXBzZSBOTCBkaXJlY3Rvcnkgc3RydWN0dXJlLgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VwcG9ydGVkCiAgICAgICovCkBAIC0zMjgsMTQgKzI3Nyw2IEBACiAgICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKFNVUFBPUlRfRlJBR01FTlRTKTsKICAgICB9CiAgICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIGxpbmVzIHNob3VsZCBiZSB3cmFwcGVkIGlmIHRvbyBiaWcgd2hlbiBnZW5lcmF0aW5nIGZpbGUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB3cmFwcGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNXcmFwTGluZXNFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihXUkFQX0xJTkVTX0VOQUJMRUQpOwotICAgIH0KLSAgICAKIC8vICAgIC8qKgogLy8gICAgICogVHJ1ZSBpZmYgdGhlIEkxOE4gZWRpdG9yIHBhZ2Ugc2hvdWxkIGNvbnRpYWluIGEgY29tbWVudCBmaWVsZCBmb3IgdGhlCiAvLyAgICAgKiBkZWZhdWx0IGxhbmd1YWdlCkBAIC0zNTYsMTQgKzI5Nyw2IEBACiAvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oRElTUExBWV9MQU5HX0NPTU1FTlRfRklFTERTKTsKIC8vICAgIH0KIC8vICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgYWZ0ZXIgd2hpY2ggbGluZXMgc2hvdWxkIGJlIHdyYXBwZWQgd2hlbgotICAgICAqIGdlbmVyYXRpbmcgZmlsZS4KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRXcmFwTGluZUxlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIFBSRUZTLmdldEludChXUkFQX0xJTkVfTEVOR1RIKTsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXIgdG8gYXBwbHkgb24gdGhlIGRpc3BsYXllZCBwcm9wZXJ0aWVzLgpAQCAtMzgyLDQ5ICszMTUsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB3cmFwcGVkIGxpbmVzIHNob3VsZCBiZSBhbGlnbmVkIHdpdGggZXF1YWwgc2lnbiB3aGVuCi0gICAgICogZ2VuZXJhdGluZyBmaWxlLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxpZ25lZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV3JhcEFsaWduRXF1YWxzRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oV1JBUF9BTElHTl9FUVVBTFNfRU5BQkxFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byB1c2UgZm9yIGluZGVudGF0aW9uIG9mIHdyYXBwZWQgbGluZXMgd2hlbgotICAgICAqIGdlbmVyYXRpbmcgZmlsZS4KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBzcGFjZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFdyYXBJbmRlbnRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBQUkVGUy5nZXRJbnQoV1JBUF9JTkRFTlRfTEVOR1RIKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdG8gY29udmVydCBlbmNvZGVkIHN0cmluZ3MgdG8gdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4KLSAgICAgKiByZWFkaW5nIGZpbGUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb252ZXJ0aW5nCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVbmljb2RlVW5lc2NhcGVFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihVTklDT0RFX1VORVNDQVBFX0VOQUJMRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0byBlc2NhcGUgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXNjYXBpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaWNvZGVFc2NhcGVFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihVTklDT0RFX0VTQ0FQRV9FTkFCTEVEKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIGVzY2FwZWQgdW5pY29kZSAiYWxwaGEiIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHVwcGVyY2FzZQotICAgICAqIHdoZW4gZ2VuZXJhdGluZyBmaWxlLiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVwcGVyY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVW5pY29kZUVzY2FwZVVwcGVyY2FzZSgpIHsKLSAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oVU5JQ09ERV9FU0NBUEVfVVBQRVJDQVNFKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBHZXRzIHdoZXRoZXIgd2Ugd2FudCB0byBvdmVyd3JpdGUgc3lzdGVtIChvciBFY2xpcHNlKSBkZWZhdWx0IG5ldyBsaW5lCiAgICAgICogdHlwZSB3aGVuIGdlbmVyYXRpbmcgZmlsZS4KICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG92ZXJ3cml0aW5nCkBAIC00MzQsMjQgKzMyNCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV3IGxpbmUgdHlwZSB0byB1c2Ugd2hlbiBvdmVyd3JpdGluZyBzeXN0ZW0gKG9yIEVjbGlwc2UpCi0gICAgICogZGVmYXVsdCBuZXcgbGluZSB0eXBlIHdoZW4gZ2VuZXJhdGluZyBmaWxlLiAgVXNlIGNvbnN0YW50cyB0byB0aGlzCi0gICAgICogZWZmZWN0LgotICAgICAqIEByZXR1cm4gbmV3IGxpbmUgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TmV3TGluZVN0eWxlKCkgewotICAgICAgICByZXR1cm4gUFJFRlMuZ2V0SW50KE5FV19MSU5FX1NUWUxFKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIG5ldyBsaW5lcyBhcmUgZXNjYXBlZCBvciBwcmludGVkIGFzIGlzIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJpbnRlZCBhcyBpcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05ld0xpbmVOaWNlKCkgewotICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihORVdfTElORV9OSUNFKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBHZXRzIHdoZXRoZXIgdG8gcmVwb3J0IGtleXMgd2l0aCBtaXNzaW5nIHZhbHVlcy4KICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlcG9ydGluZwogICAgICAqLwpAQCAtNTU1LDE0ICs0MjcsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0byBzb3J0IGtleXMgdXBvbiBzZXJpYWxpemluZyB0aGVtLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYga2V5cyBhcmUgdG8gYmUgc29ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzS2V5U29ydGluZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKFNPUlRfS0VZUyk7Ci0gICAgfQotICAgIAotICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsb2NhbGVzLXN0cmluZy1tYXRjaGVycy4KICAgICAgKiA8cD4KICAgICAgKiBOb3RlOiBTdHJpbmdNYXRjaGVyIGlzIGFuIGludGVybmFsIEFQSSBkdXBsaWNhdGVkIGluIG1hbnkgZGlmZmVyZW50IHBsYWNlcyBvZiBlY2xpcHNlLgpAQCAtNzAxLDUgKzU2NSwxNjcgQEAKIAkJCX0KIAkJfQogCX0KLSAgICAgICAgCisJCisJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjUHJvcGVydGllc1NlcmlhbGl6ZXJDb25maWcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJCisvLyAgICAvKioKKy8vICAgICAqIEdldHMgd2hldGhlciB0byBlc2NhcGUgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgorLy8gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlc2NhcGluZworLy8gICAgICovCisvLyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaWNvZGVFc2NhcGVFbmFibGVkKCkgeworLy8gICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKFVOSUNPREVfRVNDQVBFX0VOQUJMRUQpOworLy8gICAgfQorLy8JCisvLyAgICAvKioKKy8vICAgICAqIEdldHMgdGhlIG5ldyBsaW5lIHR5cGUgdG8gdXNlIHdoZW4gb3ZlcndyaXRpbmcgc3lzdGVtIChvciBFY2xpcHNlKQorLy8gICAgICogZGVmYXVsdCBuZXcgbGluZSB0eXBlIHdoZW4gZ2VuZXJhdGluZyBmaWxlLiAgVXNlIGNvbnN0YW50cyB0byB0aGlzCisvLyAgICAgKiBlZmZlY3QuCisvLyAgICAgKiBAcmV0dXJuIG5ldyBsaW5lIHR5cGUKKy8vICAgICAqLworLy8gICAgcHVibGljIGludCBnZXROZXdMaW5lU3R5bGUoKSB7CisvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEludChORVdfTElORV9TVFlMRSk7CisvLyAgICB9CisvLyAgICAgICAgCisvLyAgICAvKioKKy8vICAgICAqIEdldHMgaG93IG1hbnkgYmxhbmsgbGluZXMgc2hvdWxkIHNlcGFyYXRlIGdyb3VwcyB3aGVuIGdlbmVyYXRpbmcgZmlsZS4KKy8vICAgICAqIEByZXR1cm4gaG93IG1hbnkgYmxhbmsgbGluZXMgYmV0d2VlbiBncm91cHMKKy8vICAgICAqLworLy8gICAgcHVibGljIGludCBnZXRHcm91cFNlcEJsYW5rTGluZUNvdW50KCkgeworLy8gICAgICAgIHJldHVybiBQUkVGUy5nZXRJbnQoR1JPVVBfU0VQX0JMQU5LX0xJTkVfQ09VTlQpOworLy8gICAgfQorLy8gICAgCisvLyAgICAvKioKKy8vICAgICAqIEdldHMgd2hldGhlciB0byBwcmludCAiR2VuZXJhdGVkIEJ5Li4uIiBjb21tZW50IHdoZW4gZ2VuZXJhdGluZyBmaWxlLgorLy8gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB3ZSBwcmludCBpdAorLy8gICAgICovCisvLyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dTdXBwb3J0RW5hYmxlZCgpIHsKKy8vICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihTSE9XX1NVUFBPUlRfRU5BQkxFRCk7CisvLyAgICB9CisvLyAgICAKKy8vICAgIC8qKgorLy8gICAgICogR2V0cyB3aGV0aGVyIGtleXMgc2hvdWxkIGJlIGdyb3VwZWQgd2hlbiBnZW5lcmF0aW5nIGZpbGUuCisvLyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGtleXMgc2hvdWxkIGJlIGdyb3VwZWQKKy8vICAgICAqLworLy8gICAgcHVibGljIGJvb2xlYW4gaXNHcm91cEtleXNFbmFibGVkKCkgeworLy8gICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKEdST1VQX0tFWVNfRU5BQkxFRCk7CisvLyAgICB9CisvLyAgICAKKy8vICAgIC8qKgorLy8gICAgICogR2V0cyB3aGV0aGVyIGVzY2FwZWQgdW5pY29kZSAiYWxwaGEiIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHVwcGVyY2FzZQorLy8gICAgICogd2hlbiBnZW5lcmF0aW5nIGZpbGUuIAorLy8gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB1cHBlcmNhc2UKKy8vICAgICAqLworLy8gICAgcHVibGljIGJvb2xlYW4gaXNVbmljb2RlRXNjYXBlVXBwZXJjYXNlKCkgeworLy8gICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKFVOSUNPREVfRVNDQVBFX1VQUEVSQ0FTRSk7CisvLyAgICB9CisvLyAgICAKKy8vICAgIC8qKgorLy8gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlciBhZnRlciB3aGljaCBsaW5lcyBzaG91bGQgYmUgd3JhcHBlZCB3aGVuCisvLyAgICAgKiBnZW5lcmF0aW5nIGZpbGUuCisvLyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBpbnQgZ2V0V3JhcExpbmVMZW5ndGgoKSB7CisvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEludChXUkFQX0xJTkVfTEVOR1RIKTsKKy8vICAgIH0KKy8vICAgIAorLy8gICAgLyoqCisvLyAgICAgKiBHZXRzIHdoZXRoZXIgbGluZXMgc2hvdWxkIGJlIHdyYXBwZWQgaWYgdG9vIGJpZyB3aGVuIGdlbmVyYXRpbmcgZmlsZS4KKy8vICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgd3JhcHBlZAorLy8gICAgICovCisvLyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyYXBMaW5lc0VuYWJsZWQoKSB7CisvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oV1JBUF9MSU5FU19FTkFCTEVEKTsKKy8vICAgIH0KKy8vICAgIAorLy8gICAgLyoqCisvLyAgICAgKiBHZXRzIHdoZXRoZXIgd3JhcHBlZCBsaW5lcyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIGVxdWFsIHNpZ24gd2hlbgorLy8gICAgICogZ2VuZXJhdGluZyBmaWxlLgorLy8gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGlnbmVkCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBib29sZWFuIGlzV3JhcEFsaWduRXF1YWxzRW5hYmxlZCgpIHsKKy8vICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihXUkFQX0FMSUdOX0VRVUFMU19FTkFCTEVEKTsKKy8vICAgIH0KKy8vICAgIAorLy8gICAgLyoqCisvLyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3BhY2VzIHRvIHVzZSBmb3IgaW5kZW50YXRpb24gb2Ygd3JhcHBlZCBsaW5lcyB3aGVuCisvLyAgICAgKiBnZW5lcmF0aW5nIGZpbGUuCisvLyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBzcGFjZXMKKy8vICAgICAqLworLy8gICAgcHVibGljIGludCBnZXRXcmFwSW5kZW50TGVuZ3RoKCkgeworLy8gICAgICAgIHJldHVybiBQUkVGUy5nZXRJbnQoV1JBUF9JTkRFTlRfTEVOR1RIKTsKKy8vICAgIH0KKy8vICAgIAorLy8gICAgLyoqCisvLyAgICAgKiBHZXRzIHdoZXRoZXIgdGhlcmUgc2hvdWxkIGJlIHNwYWNlcyBhcm91bmQgZXF1YWxzIHNpZ25zIHdoZW4gZ2VuZXJhdGluZyAKKy8vICAgICAqIGZpbGUuCisvLyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRoZXJlIGlmIHNob3VsZCBiZSBzcGFjZXMgYXJvdW5kIGVxdWFscyBzaWducworLy8gICAgICovCisvLyAgICBwdWJsaWMgYm9vbGVhbiBpc1NwYWNlc0Fyb3VuZEVxdWFsc0VuYWJsZWQoKSB7CisvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oU1BBQ0VTX0FST1VORF9FUVVBTFNfRU5BQkxFRCk7CisvLyAgICB9CisvLyAgICAKKy8vICAgIC8qKgorLy8gICAgICogR2V0cyB3aGV0aGVyIG5ldyBsaW5lcyBhcmUgZXNjYXBlZCBvciBwcmludGVkIGFzIGlzIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgorLy8gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcmludGVkIGFzIGlzLgorLy8gICAgICovCisvLyAgICBwdWJsaWMgYm9vbGVhbiBpc05ld0xpbmVOaWNlKCkgeworLy8gICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKE5FV19MSU5FX05JQ0UpOworLy8gICAgfQorLy8gICAgCisvLyAgICAvKioKKy8vICAgICAqIEdldHMgaG93IG1hbnkgbGV2ZWwgZGVlcCBrZXlzIHNob3VsZCBiZSBncm91cGVkIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgorLy8gICAgICogQHJldHVybiBob3cgbWFueSBsZXZlbCBkZWVwCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBMZXZlbERlcHRoKCkgeworLy8gICAgICAgIHJldHVybiBQUkVGUy5nZXRJbnQoR1JPVVBfTEVWRUxfREVFUCk7CisvLyAgICB9CisvLyAKKy8vICAgIC8qKgorLy8gICAgICogR2V0cyBrZXkgZ3JvdXAgc2VwYXJhdG9yLgorLy8gICAgICogQHJldHVybiBrZXkgZ3JvdXAgc2VwYXJhdG9yLgorLy8gICAgICovCisvLyAgICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwTGV2ZWxTZXBhcmF0b3IoKSB7CisvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldFN0cmluZyhHUk9VUF9fTEVWRUxfU0VQQVJBVE9SKTsKKy8vICAgIH0KKy8vICAgIAorLy8gICAgLyoqCisvLyAgICAgKiBHZXRzIHdoZXRoZXIgZXF1YWxzIHNpZ25zIHNob3VsZCBiZSBhbGlnbmVkIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgorLy8gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlcXVhbHMgc2lnbnMgc2hvdWxkIGJlIGFsaWduZWQKKy8vICAgICAqLworLy8gICAgcHVibGljIGJvb2xlYW4gaXNBbGlnbkVxdWFsc0VuYWJsZWQoKSB7CisvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oQUxJR05fRVFVQUxTX0VOQUJMRUQpOworLy8gICAgfQorLy8gICAgCisvLyAgICAvKioKKy8vICAgICAqIEdldHMgd2hldGhlciBlcXVhbCBzaWducyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoaW4gZWFjaCBncm91cHMgd2hlbgorLy8gICAgICogZ2VuZXJhdGluZyBmaWxlLgorLy8gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlcXVhbCBzaWducyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoaW4gZ3JvdXBzCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBBbGlnbkVxdWFsc0VuYWJsZWQoKSB7CisvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oR1JPVVBfQUxJR05fRVFVQUxTX0VOQUJMRUQpOworLy8gICAgfQorLy8gICAgCisvLyAgICAvKioKKy8vICAgICAqIEdldHMgd2hldGhlciB0byBzb3J0IGtleXMgdXBvbiBzZXJpYWxpemluZyB0aGVtLgorLy8gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBrZXlzIGFyZSB0byBiZSBzb3J0ZWQuCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBib29sZWFuIGlzS2V5U29ydGluZ0VuYWJsZWQoKSB7CisvLyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oU09SVF9LRVlTKTsKKy8vICAgIH0KKyAgICAKKwkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAKKyAgICAKKy8vICAgIC8qKgorLy8gICAgICogR2V0cyB3aGV0aGVyIHRvIGNvbnZlcnQgZW5jb2RlZCBzdHJpbmdzIHRvIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCisvLyAgICAgKiByZWFkaW5nIGZpbGUuCisvLyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbnZlcnRpbmcKKy8vICAgICAqLworLy8gICAgcHVibGljIGJvb2xlYW4gaXNVbmljb2RlVW5lc2NhcGVFbmFibGVkKCkgeworLy8gICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKFVOSUNPREVfVU5FU0NBUEVfRU5BQkxFRCk7CisvLyAgICB9CisgICAgCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmluZGV4IDc4YTgyYzYuLmUyYWQ1ODkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgIHByZWZzLnNldERlZmF1bHQoTXNnRWRpdG9yUHJlZmVyZW5jZXMuV1JBUF9JTkRFTlRfTEVOR1RILCA4KTsKIAogICAgICAgICBwcmVmcy5zZXREZWZhdWx0KE1zZ0VkaXRvclByZWZlcmVuY2VzLk5FV19MSU5FX1NUWUxFLCAKLSAgICAgICAgICAgICAgICBNc2dFZGl0b3JQcmVmZXJlbmNlcy5ORVdfTElORV9VTklYKTsKKyAgICAgICAgICAgICAgICBNc2dFZGl0b3JQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmdldFNlcmlhbGl6ZXJDb25maWcoKS5ORVdfTElORV9VTklYKTsKIAogICAgICAgICBwcmVmcy5zZXREZWZhdWx0KE1zZ0VkaXRvclByZWZlcmVuY2VzLktFRVBfRU1QVFlfRklFTERTLCBmYWxzZSk7CiAgICAgICAgIHByZWZzLnNldERlZmF1bHQoTXNnRWRpdG9yUHJlZmVyZW5jZXMuU09SVF9LRVlTLCB0cnVlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL1Byb3BlcnRpZXNEZXNlcmlhbGl6ZXJDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ByZWZlcmVuY2VzL1Byb3BlcnRpZXNEZXNlcmlhbGl6ZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmI4ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcHJlZmVyZW5jZXMvUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGFzY2FsIEVzc2llbWJyZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgUGFzY2FsIEVzc2llbWJyZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgQWxleGVqIFN0cmVsem93IC0gbW92ZWQgY29kZSB0byBoZXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5JUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKKworLyoqCisgKiBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQcm9wZXJ0aWVzRGVzZXJpYWxpemVyQ29uZmlnfS4KKyAqIAorICogQGF1dGhvciBBbGV4ZWogU3RyZWx6b3cKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnRpZXNEZXNlcmlhbGl6ZXJDb25maWcgaW1wbGVtZW50cworCQlJUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZyB7IC8vICBNb3ZlZCBmcm9tIE1zZ0VkaXRvclByZWZlcmVuY2VzLCB0byBtYWtlIGl0IG1vcmUgZmxleGlibGUuCisKKyAgICAvKiogTXNnRWRpdG9yUHJlZmVyZW5jZXMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJlZmVyZW5jZXMgUFJFRlMgPSAKKyAgICAgICAgICAgIE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCisgICAgUHJvcGVydGllc0Rlc2VyaWFsaXplckNvbmZpZygpIHsKKyAgICAJQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXREZXNlcmlhbGl6ZXJDb25maWcodGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0byBjb252ZXJ0IGVuY29kZWQgc3RyaW5ncyB0byB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbgorICAgICAqIHJlYWRpbmcgZmlsZS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbnZlcnRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaWNvZGVVbmVzY2FwZUVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKE1zZ0VkaXRvclByZWZlcmVuY2VzLlVOSUNPREVfVU5FU0NBUEVfRU5BQkxFRCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wcmVmZXJlbmNlcy9Qcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcHJlZmVyZW5jZXMvUHJvcGVydGllc1NlcmlhbGl6ZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDNiMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcHJlZmVyZW5jZXMvUHJvcGVydGllc1NlcmlhbGl6ZXJDb25maWcuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBQYXNjYWwgRXNzaWVtYnJlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBBbGV4ZWogU3RyZWx6b3cgLSBtb3ZlZCBjb2RlIHRvIGhlcmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wcmVmZXJlbmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLklQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKKworLyoqCisgKiBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZ30uCisgKiAKKyAqIEBhdXRob3IgQWxleGVqIFN0cmVsem93CisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZyBpbXBsZW1lbnRzIElQcm9wZXJ0aWVzU2VyaWFsaXplckNvbmZpZyB7CisJLy8gIE1vdmVkIGZyb20gTXNnRWRpdG9yUHJlZmVyZW5jZXMsIHRvIG1ha2UgaXQgbW9yZSBmbGV4aWJsZS4KKworICAgIC8qKiBNc2dFZGl0b3JQcmVmZXJlbmNlcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVmZXJlbmNlcyBQUkVGUyA9IAorICAgICAgICAgICAgTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCisgICAgUHJvcGVydGllc1NlcmlhbGl6ZXJDb25maWcoKSB7CisgICAgCUNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0U2VyaWFsaXplckNvbmZpZyh0aGlzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRvIGVzY2FwZSB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbiBnZW5lcmF0aW5nIGZpbGUuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlc2NhcGluZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVW5pY29kZUVzY2FwZUVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKE1zZ0VkaXRvclByZWZlcmVuY2VzLlVOSUNPREVfRVNDQVBFX0VOQUJMRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5ldyBsaW5lIHR5cGUgdG8gdXNlIHdoZW4gb3ZlcndyaXRpbmcgc3lzdGVtIChvciBFY2xpcHNlKQorICAgICAqIGRlZmF1bHQgbmV3IGxpbmUgdHlwZSB3aGVuIGdlbmVyYXRpbmcgZmlsZS4gIFVzZSBjb25zdGFudHMgdG8gdGhpcworICAgICAqIGVmZmVjdC4KKyAgICAgKiBAcmV0dXJuIG5ldyBsaW5lIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE5ld0xpbmVTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEludChNc2dFZGl0b3JQcmVmZXJlbmNlcy5ORVdfTElORV9TVFlMRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBob3cgbWFueSBibGFuayBsaW5lcyBzaG91bGQgc2VwYXJhdGUgZ3JvdXBzIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgorICAgICAqIEByZXR1cm4gaG93IG1hbnkgYmxhbmsgbGluZXMgYmV0d2VlbiBncm91cHMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEdyb3VwU2VwQmxhbmtMaW5lQ291bnQoKSB7CisgICAgICAgIHJldHVybiBQUkVGUy5nZXRJbnQoTXNnRWRpdG9yUHJlZmVyZW5jZXMuR1JPVVBfU0VQX0JMQU5LX0xJTkVfQ09VTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0byBwcmludCAiR2VuZXJhdGVkIEJ5Li4uIiBjb21tZW50IHdoZW4gZ2VuZXJhdGluZyBmaWxlLgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgd2UgcHJpbnQgaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dTdXBwb3J0RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oTXNnRWRpdG9yUHJlZmVyZW5jZXMuU0hPV19TVVBQT1JUX0VOQUJMRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciBrZXlzIHNob3VsZCBiZSBncm91cGVkIHdoZW4gZ2VuZXJhdGluZyBmaWxlLgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYga2V5cyBzaG91bGQgYmUgZ3JvdXBlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBLZXlzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oTXNnRWRpdG9yUHJlZmVyZW5jZXMuR1JPVVBfS0VZU19FTkFCTEVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgZXNjYXBlZCB1bmljb2RlICJhbHBoYSIgY2hhcmFjdGVycyBzaG91bGQgYmUgdXBwZXJjYXNlCisgICAgICogd2hlbiBnZW5lcmF0aW5nIGZpbGUuIAorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdXBwZXJjYXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVbmljb2RlRXNjYXBlVXBwZXJjYXNlKCkgeworICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihNc2dFZGl0b3JQcmVmZXJlbmNlcy5VTklDT0RFX0VTQ0FQRV9VUFBFUkNBU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgYWZ0ZXIgd2hpY2ggbGluZXMgc2hvdWxkIGJlIHdyYXBwZWQgd2hlbgorICAgICAqIGdlbmVyYXRpbmcgZmlsZS4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXcmFwTGluZUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEludChNc2dFZGl0b3JQcmVmZXJlbmNlcy5XUkFQX0xJTkVfTEVOR1RIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgbGluZXMgc2hvdWxkIGJlIHdyYXBwZWQgaWYgdG9vIGJpZyB3aGVuIGdlbmVyYXRpbmcgZmlsZS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyYXBMaW5lc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKE1zZ0VkaXRvclByZWZlcmVuY2VzLldSQVBfTElORVNfRU5BQkxFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHdyYXBwZWQgbGluZXMgc2hvdWxkIGJlIGFsaWduZWQgd2l0aCBlcXVhbCBzaWduIHdoZW4KKyAgICAgKiBnZW5lcmF0aW5nIGZpbGUuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGlnbmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNXcmFwQWxpZ25FcXVhbHNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihNc2dFZGl0b3JQcmVmZXJlbmNlcy5XUkFQX0FMSUdOX0VRVUFMU19FTkFCTEVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3BhY2VzIHRvIHVzZSBmb3IgaW5kZW50YXRpb24gb2Ygd3JhcHBlZCBsaW5lcyB3aGVuCisgICAgICogZ2VuZXJhdGluZyBmaWxlLgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHNwYWNlcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0V3JhcEluZGVudExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEludChNc2dFZGl0b3JQcmVmZXJlbmNlcy5XUkFQX0lOREVOVF9MRU5HVEgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGVyZSBzaG91bGQgYmUgc3BhY2VzIGFyb3VuZCBlcXVhbHMgc2lnbnMgd2hlbiBnZW5lcmF0aW5nIAorICAgICAqIGZpbGUuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0aGVyZSBpZiBzaG91bGQgYmUgc3BhY2VzIGFyb3VuZCBlcXVhbHMgc2lnbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NwYWNlc0Fyb3VuZEVxdWFsc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKE1zZ0VkaXRvclByZWZlcmVuY2VzLlNQQUNFU19BUk9VTkRfRVFVQUxTX0VOQUJMRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciBuZXcgbGluZXMgYXJlIGVzY2FwZWQgb3IgcHJpbnRlZCBhcyBpcyB3aGVuIGdlbmVyYXRpbmcgZmlsZS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHByaW50ZWQgYXMgaXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lTmljZSgpIHsKKyAgICAgICAgcmV0dXJuIFBSRUZTLmdldEJvb2xlYW4oTXNnRWRpdG9yUHJlZmVyZW5jZXMuTkVXX0xJTkVfTklDRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBob3cgbWFueSBsZXZlbCBkZWVwIGtleXMgc2hvdWxkIGJlIGdyb3VwZWQgd2hlbiBnZW5lcmF0aW5nIGZpbGUuCisgICAgICogQHJldHVybiBob3cgbWFueSBsZXZlbCBkZWVwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRHcm91cExldmVsRGVwdGgoKSB7CisgICAgICAgIHJldHVybiBQUkVGUy5nZXRJbnQoTXNnRWRpdG9yUHJlZmVyZW5jZXMuR1JPVVBfTEVWRUxfREVFUCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBrZXkgZ3JvdXAgc2VwYXJhdG9yLgorICAgICAqIEByZXR1cm4ga2V5IGdyb3VwIHNlcGFyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwTGV2ZWxTZXBhcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBQUkVGUy5nZXRTdHJpbmcoTXNnRWRpdG9yUHJlZmVyZW5jZXMuR1JPVVBfX0xFVkVMX1NFUEFSQVRPUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIGVxdWFscyBzaWducyBzaG91bGQgYmUgYWxpZ25lZCB3aGVuIGdlbmVyYXRpbmcgZmlsZS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVxdWFscyBzaWducyBzaG91bGQgYmUgYWxpZ25lZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWxpZ25FcXVhbHNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihNc2dFZGl0b3JQcmVmZXJlbmNlcy5BTElHTl9FUVVBTFNfRU5BQkxFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIGVxdWFsIHNpZ25zIHNob3VsZCBiZSBhbGlnbmVkIHdpdGhpbiBlYWNoIGdyb3VwcyB3aGVuCisgICAgICogZ2VuZXJhdGluZyBmaWxlLgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXF1YWwgc2lnbnMgc2hvdWxkIGJlIGFsaWduZWQgd2l0aGluIGdyb3VwcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBBbGlnbkVxdWFsc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBQUkVGUy5nZXRCb29sZWFuKE1zZ0VkaXRvclByZWZlcmVuY2VzLkdST1VQX0FMSUdOX0VRVUFMU19FTkFCTEVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdG8gc29ydCBrZXlzIHVwb24gc2VyaWFsaXppbmcgdGhlbS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGtleXMgYXJlIHRvIGJlIHNvcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0tleVNvcnRpbmdFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gUFJFRlMuZ2V0Qm9vbGVhbihNc2dFZGl0b3JQcmVmZXJlbmNlcy5TT1JUX0tFWVMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVmYWN0b3JpbmcvUmVuYW1lS2V5Q2hhbmdlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZWZhY3RvcmluZy9SZW5hbWVLZXlDaGFuZ2UuamF2YQppbmRleCA5NjFjYWFlLi5lMDE3ZGFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZWZhY3RvcmluZy9SZW5hbWVLZXlDaGFuZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZWZhY3RvcmluZy9SZW5hbWVLZXlDaGFuZ2UuamF2YQpAQCAtMTMsOCArMTMsOCBAQAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuaW50ZXJuYWwuS2V5VHJlZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwpAQCAtMTIwLDkgKzEyMCw5IEBACiAJCQlwbS5iZWdpblRhc2soIlJlbmFtZSByZXNvdXJjZSBidW5kbGUga2V5IiwgMSk7CiAKIAkJCS8vIEZpbmQgdGhlIHJvb3QgLSB3ZSB3aWxsIG5lZWQgdGhpcyBsYXRlcgotCQkJS2V5VHJlZU5vZGUgcm9vdCA9IGZLZXlUcmVlTm9kZS5nZXRQYXJlbnQoKTsKKwkJCUtleVRyZWVOb2RlIHJvb3QgPSAoS2V5VHJlZU5vZGUpIGZLZXlUcmVlTm9kZS5nZXRQYXJlbnQoKTsKIAkJCXdoaWxlIChyb290LmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJcm9vdCA9IHJvb3QuZ2V0UGFyZW50KCk7CisJCQkJcm9vdCA9IChLZXlUcmVlTm9kZSkgcm9vdC5nZXRQYXJlbnQoKTsKIAkJCX0KIAkJCQogCQkJaWYgKGZSZW5hbWVDaGlsZEtleXMpIHsKQEAgLTE0Niw3ICsxNDYsNyBAQAogCQkJU3RyaW5nIHNlZ21lbnRzIFtdID0gZk5ld05hbWUuc3BsaXQoIlxcLiIpOwogCQkJS2V5VHJlZU5vZGUgcmVuYW1lZEtleSA9IHJvb3Q7CiAJCQlmb3IgKFN0cmluZyBzZWdtZW50IDogc2VnbWVudHMpIHsKLQkJCQlyZW5hbWVkS2V5ID0gcmVuYW1lZEtleS5nZXRDaGlsZChzZWdtZW50KTsKKwkJCQlyZW5hbWVkS2V5ID0gKEtleVRyZWVOb2RlKSByZW5hbWVkS2V5LmdldENoaWxkKHNlZ21lbnQpOwogCQkJfQogCQkJCiAJCQlhc3NlcnQocmVuYW1lZEtleSAhPSBudWxsKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3JlZmFjdG9yaW5nL1JlbmFtZUtleURlc2NyaXB0b3IuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3JlZmFjdG9yaW5nL1JlbmFtZUtleURlc2NyaXB0b3IuamF2YQppbmRleCA5MjUxOTk5Li5kYWQ4NmZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZWZhY3RvcmluZy9SZW5hbWVLZXlEZXNjcmlwdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVmYWN0b3JpbmcvUmVuYW1lS2V5RGVzY3JpcHRvci5qYXZhCkBAIC0xMCw4ICsxMCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmVmYWN0b3Jpbmc7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5LZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5LZXlUcmVlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVmYWN0b3JpbmcvUmVuYW1lS2V5UHJvY2Vzc29yLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZWZhY3RvcmluZy9SZW5hbWVLZXlQcm9jZXNzb3IuamF2YQppbmRleCAwYjBlM2UyLi4wMTUxZDVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZWZhY3RvcmluZy9SZW5hbWVLZXlQcm9jZXNzb3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZWZhY3RvcmluZy9SZW5hbWVLZXlQcm9jZXNzb3IuamF2YQpAQCAtMTIsOCArMTIsOCBAQAogCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5LZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5LZXlUcmVlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLklSZXNvdXJjZUNoYW5nZURlc2NyaXB0aW9uRmFjdG9yeTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3JlZmFjdG9yaW5nL1JlbmFtZUtleVdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVmYWN0b3JpbmcvUmVuYW1lS2V5V2l6YXJkLmphdmEKaW5kZXggNjY4MzU0NS4uY2VmYzZmYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVmYWN0b3JpbmcvUmVuYW1lS2V5V2l6YXJkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVmYWN0b3JpbmcvUmVuYW1lS2V5V2l6YXJkLmphdmEKQEAgLTEwLDcgKzEwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yZWZhY3RvcmluZzsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLktleVRyZWVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsLktleVRyZWVOb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS9FY2xpcHNlUHJvcGVydGllc0VkaXRvclJlc291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS9FY2xpcHNlUHJvcGVydGllc0VkaXRvclJlc291cmNlLmphdmEKaW5kZXggYjQxM2E0NC4uNTllNTdhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVzb3VyY2UvRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3Jlc291cmNlL0VjbGlwc2VQcm9wZXJ0aWVzRWRpdG9yUmVzb3VyY2UuamF2YQpAQCAtNywxOSArNywxNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIEFsZXhlaiBTdHJlbHpvdyAtIFRhcEpJIGludGVncmF0aW9uIC0+IERpcnR5SGFjawogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJlc291cmNlOwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLmNvbmZpZ3VyYXRpb24uRGlydHlIYWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5pbnRlcm5hbC5BYnN0cmFjdFByb3BlcnRpZXNSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLlByb3BlcnRpZXNEZXNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5Qcm9wZXJ0aWVzU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvcjsKQEAgLTY3LDIwICs2NSwyMCBAQAogLy8gICAgICAgIH07CiAvLyAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmNsKTsgICAgICAgIAogICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KAotICAgICAgICAgICAgICAgIHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRE9DVU1FTlQ6IiArIGRvY3VtZW50KTsKLSAgICAgICAgZG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgSURvY3VtZW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRE9DVU1FTlQgQUJPVVQgdG8gQ0hBTkdFOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRPQ1VNRU5UIENIQU5HRUQ6Iik7Ci0gICAgICAgICAgICAgICAgZmlyZVJlc291cmNlQ2hhbmdlKEVjbGlwc2VQcm9wZXJ0aWVzRWRpdG9yUmVzb3VyY2UudGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICAvLyBbYWxzdF0gZG8gd2UgcmVhbGx5IG5lZWQgdGhpcz8gSXQgY2F1c2VzIGFuIGVuZGxlc3MgbG9vcCEKKy8vICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCgKKy8vICAgICAgICAgICAgICAgIHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJET0NVTUVOVDoiICsgZG9jdW1lbnQpOworLy8gICAgICAgIGRvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIobmV3IElEb2N1bWVudExpc3RlbmVyKCkgeworLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgeworLy8gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCisvLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRPQ1VNRU5UIEFCT1VUIHRvIENIQU5HRToiKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgeworLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJET0NVTUVOVCBDSEFOR0VEOiIpOworLy8vLyAgICAgICAgICAgICAgICBmaXJlUmVzb3VyY2VDaGFuZ2UoRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZS50aGlzKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgIH0pOwogICAgICAgICAKIC8vICAgICAgICBJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwogLy8vLyAgICAgICAgUHJvcGVydGllc0ZpbGVEb2N1bWVudFByb3ZpZGVyCkBAIC0xMzcsMTIgKzEzNSwxNSBAQAogICAgIAkgKiB3ZSBhcmUgb24gdGhlIFVJIHRocmVhZC4gIFRoaXMgbWF5IG5vdCBiZSB0aGUgYmVzdCBwbGFjZSB0byBkbwogICAgIAkgKiB0aGlzPz8/CiAgICAgCSAqLwotICAgIAlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkgICAgICAgIHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KAotCQkgICAgICAgICAgICAgICAgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5zZXQoY29udGVudCk7Ci0JCQl9Ci0JCX0pOworICAgIAkvLyBbYWxzdF0gbXVzcyAyeCBzcGVpY2hlcm4gd2VubiBhc3luYyBleGVjCisvLyAgICAJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKy8vCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQlpZiAoRGlydHlIYWNrLmlzRWRpdG9yTW9kaWZpY2F0aW9uRW5hYmxlZCgpKSB7CisJCQl0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKQorCQkJCQkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5zZXQoY29udGVudCk7CisJCX0KKy8vCQkJfQorLy8JCX0pOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVzb3VyY2UvdmFsaWRhdG9yL0ZpbGVNYXJrZXJTdHJhdGVneS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVzb3VyY2UvdmFsaWRhdG9yL0ZpbGVNYXJrZXJTdHJhdGVneS5qYXZhCmluZGV4IDMxN2M4YTcuLmIwMzUyMWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3Jlc291cmNlL3ZhbGlkYXRvci9GaWxlTWFya2VyU3RyYXRlZ3kuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS92YWxpZGF0b3IvRmlsZU1hcmtlclN0cmF0ZWd5LmphdmEKQEAgLTEwLDggKzEwLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yZXNvdXJjZS52YWxpZGF0b3I7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLkR1cGxpY2F0ZVZhbHVlQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5NaXNzaW5nVmFsdWVDaGVjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLmludGVybmFsLkR1cGxpY2F0ZVZhbHVlQ2hlY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5pbnRlcm5hbC5NaXNzaW5nVmFsdWVDaGVjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS51dGlsLkJhYmVsVXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnBsdWdpbi5NZXNzYWdlc0VkaXRvclBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucHJlZmVyZW5jZXMuTXNnRWRpdG9yUHJlZmVyZW5jZXM7CkBAIC0zMSw4ICszMiw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbWFya0ZhaWxlZChWYWxpZGF0aW9uRmFpbHVyZUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChldmVudC5nZXRDaGVjaygpIGluc3RhbmNlb2YgTWlzc2luZ1ZhbHVlQ2hlY2spIHsKLSAgICAgICAgICAgIGFkZE1hcmtlcigoSVJlc291cmNlKSBldmVudC5nZXRCdW5kbGVHcm91cCgpLmdldE1lc3NhZ2VzQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRMb2NhbGUoKSkuZ2V0UmVzb3VyY2UoKS5nZXRTb3VyY2UoKSwKKyAgICAgICAgICAgIE1lc3NhZ2VzQnVuZGxlIGJ1bmRsZSA9IChNZXNzYWdlc0J1bmRsZSkgZXZlbnQuZ2V0QnVuZGxlR3JvdXAoKS5nZXRNZXNzYWdlc0J1bmRsZShldmVudC5nZXRMb2NhbGUoKSk7CisgICAgICAgICAgICBhZGRNYXJrZXIoKElSZXNvdXJjZSkgYnVuZGxlLmdldFJlc291cmNlKCkuZ2V0U291cmNlKCksCiAvLyAgICAgICAgICAgIGFkZE1hcmtlcihldmVudC5nZXRSZXNvdXJjZSgpLAogICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRLZXkoKSwKICAgICAgICAgICAgICAgICAgICAgIktleSBcIiIgKyBldmVudC5nZXRLZXkoKSAvLyROT04tTkxTLTEkCkBAIC00NCw4ICs0NSw4IEBACiAgICAgICAgICAgICBTdHJpbmcgZHVwbGljYXRlcyA9IEJhYmVsVXRpbHMuam9pbigKICAgICAgICAgICAgICAgICAgICAgKChEdXBsaWNhdGVWYWx1ZUNoZWNrKSBldmVudC5nZXRDaGVjaygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREdXBsaWNhdGVLZXlzKCksICIsICIpOwotICAgICAgICAgICAgYWRkTWFya2VyKChJUmVzb3VyY2UpIGV2ZW50LmdldEJ1bmRsZUdyb3VwKCkuZ2V0TWVzc2FnZXNCdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldExvY2FsZSgpKS5nZXRSZXNvdXJjZSgpLmdldFNvdXJjZSgpLAorICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGUgYnVuZGxlID0gKE1lc3NhZ2VzQnVuZGxlKSBldmVudC5nZXRCdW5kbGVHcm91cCgpLmdldE1lc3NhZ2VzQnVuZGxlKGV2ZW50LmdldExvY2FsZSgpKTsKKyAgICAgICAgICAgIGFkZE1hcmtlcigoSVJlc291cmNlKSBidW5kbGUuZ2V0UmVzb3VyY2UoKS5nZXRTb3VyY2UoKSwKIC8vICAgICAgICAgICAgYWRkTWFya2VyKGV2ZW50LmdldFJlc291cmNlKCksCiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEtleSgpLAogICAgICAgICAgICAgICAgICAgICAiS2V5IFwiIiArIGV2ZW50LmdldEtleSgpIC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3Jlc291cmNlL3ZhbGlkYXRvci9NZXNzYWdlc0J1bmRsZUdyb3VwVmFsaWRhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS92YWxpZGF0b3IvTWVzc2FnZXNCdW5kbGVHcm91cFZhbGlkYXRvci5qYXZhCmluZGV4IDk1OTA5NDMuLjAwZGZlNzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3Jlc291cmNlL3ZhbGlkYXRvci9NZXNzYWdlc0J1bmRsZUdyb3VwVmFsaWRhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVzb3VyY2UvdmFsaWRhdG9yL01lc3NhZ2VzQnVuZGxlR3JvdXBWYWxpZGF0b3IuamF2YQpAQCAtMTIsOSArMTIsOSBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MuRHVwbGljYXRlVmFsdWVDaGVjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLk1pc3NpbmdWYWx1ZUNoZWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MuaW50ZXJuYWwuRHVwbGljYXRlVmFsdWVDaGVjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLmludGVybmFsLk1pc3NpbmdWYWx1ZUNoZWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZUdyb3VwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wcmVmZXJlbmNlcy5Nc2dFZGl0b3JQcmVmZXJlbmNlczsKIAogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS92YWxpZGF0b3IvVmFsaWRhdGlvbkZhaWx1cmVFdmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVzb3VyY2UvdmFsaWRhdG9yL1ZhbGlkYXRpb25GYWlsdXJlRXZlbnQuamF2YQppbmRleCBiOGI2YWZlLi43MjNiNDExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS92YWxpZGF0b3IvVmFsaWRhdGlvbkZhaWx1cmVFdmVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3Jlc291cmNlL3ZhbGlkYXRvci9WYWxpZGF0aW9uRmFpbHVyZUV2ZW50LmphdmEKQEAgLTEyLDggKzEyLDggQEAKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLklNZXNzYWdlQ2hlY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CiAKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL0lLZXlUcmVlQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvSUtleVRyZWVDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNTAzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL0lLZXlUcmVlQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFsZXhlaiBTdHJlbHpvdy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBBbGV4ZWogU3RyZWx6b3cgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuSUtleVRyZWVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKKworcHVibGljIGludGVyZmFjZSBJS2V5VHJlZUNvbnRyaWJ1dG9yIHsKKworCXZvaWQgY29udHJpYnV0ZShmaW5hbCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpOworCisJSUtleVRyZWVOb2RlIGdldEtleVRyZWVOb2RlKFN0cmluZyBrZXkpOworCisJSUtleVRyZWVOb2RlW10gZ2V0Um9vdEtleUl0ZW1zKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL1RyZWVUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL1RyZWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDJkNjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9UcmVlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlOwotCi1wdWJsaWMgZW51bSBUcmVlVHlwZSB7Ci0JVHJlZSwKLQlGbGF0Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL0Fic3RyYWN0VHJlZUFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL0Fic3RyYWN0VHJlZUFjdGlvbi5qYXZhCmluZGV4IGM2MmNjNWYuLmJiZmJkYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9BYnN0cmFjdFRyZWVBY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvQWJzdHJhY3RUcmVlQWN0aW9uLmphdmEKQEAgLTEwLDEwICsxMCwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9uczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLkFic3RyYWN0S2V5VHJlZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLktleVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5BYnN0cmFjdEtleVRyZWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5LZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvQWRkS2V5QWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvQWRkS2V5QWN0aW9uLmphdmEKaW5kZXggOWRkOWZjZC4uYjE0MzIxMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL0FkZEtleUFjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9BZGRLZXlBY3Rpb24uamF2YQpAQCAtMTAsOSArMTAsOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9uczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLktleVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZXNCdW5kbGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5LZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnBsdWdpbi5NZXNzYWdlc0VkaXRvclBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yOwpAQCAtMjIsNyArMjIsNyBAQAogCiAvKioKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZQotICoKKyAqIAogICovCiBwdWJsaWMgY2xhc3MgQWRkS2V5QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RUcmVlQWN0aW9uIHsKIApAQCAtMzAsMzggKzMwLDM3IEBACiAgICAgICogCiAgICAgICovCiAgICAgcHVibGljIEFkZEtleUFjdGlvbihNZXNzYWdlc0VkaXRvciBlZGl0b3IsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICBzdXBlcihlZGl0b3IsIHRyZWVWaWV3ZXIpOwotICAgICAgICBzZXRUZXh0KE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygia2V5LmFkZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5nZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5JTUFHRV9BREQpKTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoIlRPRE8gcHV0IHNvbWV0aGluZyBoZXJlIik7IC8vVE9ETyBwdXQgdG9vbHRpcAorCXN1cGVyKGVkaXRvciwgdHJlZVZpZXdlcik7CisJc2V0VGV4dChNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoImtleS5hZGQiKSArICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKKwlzZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5nZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5JTUFHRV9BREQpKTsKKwlzZXRUb29sVGlwVGV4dCgiVE9ETyBwdXQgc29tZXRoaW5nIGhlcmUiKTsgLy8gVE9ETyBwdXQgdG9vbHRpcAogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBLZXlUcmVlTm9kZSBub2RlID0gZ2V0Tm9kZVNlbGVjdGlvbigpOwotICAgICAgICBTdHJpbmcga2V5ID0gbm9kZS5nZXRNZXNzYWdlS2V5KCk7Ci0gICAgICAgIFN0cmluZyBtc2dIZWFkID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0U3RyaW5nKCJkaWFsb2cuYWRkLmhlYWQiKTsKLSAgICAgICAgU3RyaW5nIG1zZ0JvZHkgPSBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoImRpYWxvZy5hZGQuYm9keSIpOwotICAgICAgICBJbnB1dERpYWxvZyBkaWFsb2cgPSBuZXcgSW5wdXREaWFsb2coCi0gICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwgbXNnSGVhZCwgbXNnQm9keSwga2V5LCBuZXcgSUlucHV0VmFsaWRhdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRCdW5kbGVHcm91cCgpLmlzTWVzc2FnZUtleShuZXdUZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpYWxvZy5lcnJvci5leGlzdHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSyApIHsKLSAgICAgICAgICAgIFN0cmluZyBpbnB1dEtleSA9IGRpYWxvZy5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGVHcm91cCBtZXNzYWdlc0J1bmRsZUdyb3VwID0gZ2V0QnVuZGxlR3JvdXAoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VzQnVuZGxlR3JvdXAuYWRkTWVzc2FnZXMoaW5wdXRLZXkpOwotICAgICAgICB9CisJS2V5VHJlZU5vZGUgbm9kZSA9IGdldE5vZGVTZWxlY3Rpb24oKTsKKwlTdHJpbmcga2V5ID0gbm9kZS5nZXRNZXNzYWdlS2V5KCk7CisJU3RyaW5nIG1zZ0hlYWQgPSBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoImRpYWxvZy5hZGQuaGVhZCIpOworCVN0cmluZyBtc2dCb2R5ID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0U3RyaW5nKCJkaWFsb2cuYWRkLmJvZHkiKTsKKwlJbnB1dERpYWxvZyBkaWFsb2cgPSBuZXcgSW5wdXREaWFsb2coZ2V0U2hlbGwoKSwgbXNnSGVhZCwgbXNnQm9keSwga2V5LAorCQluZXcgSUlucHV0VmFsaWRhdG9yKCkgeworCQkgICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7CisJCQlpZiAoZ2V0QnVuZGxlR3JvdXAoKS5pc01lc3NhZ2VLZXkobmV3VGV4dCkpIHsKKwkJCSAgICByZXR1cm4gTWVzc2FnZXNFZGl0b3JQbHVnaW4KKwkJCQkgICAgLmdldFN0cmluZygiZGlhbG9nLmVycm9yLmV4aXN0cyIpOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCSAgICB9CisJCX0pOworCWRpYWxvZy5vcGVuKCk7CisJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7CisJICAgIFN0cmluZyBpbnB1dEtleSA9IGRpYWxvZy5nZXRWYWx1ZSgpOworCSAgICBNZXNzYWdlc0J1bmRsZUdyb3VwIG1lc3NhZ2VzQnVuZGxlR3JvdXAgPSBnZXRCdW5kbGVHcm91cCgpOworCSAgICBtZXNzYWdlc0J1bmRsZUdyb3VwLmFkZE1lc3NhZ2VzKGlucHV0S2V5KTsKKwl9CiAgICAgfQotICAgIAotICAgIAorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvQ29sbGFwc2VBbGxBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9Db2xsYXBzZUFsbEFjdGlvbi5qYXZhCmluZGV4IDhjMzJkNDguLmI4ZTE4Y2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9Db2xsYXBzZUFsbEFjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9Db2xsYXBzZUFsbEFjdGlvbi5qYXZhCkBAIC0xMCw3ICsxMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5hY3Rpb25zOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pbnRlcm5hbC5NZXNzYWdlc0VkaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci51dGlsLlVJVXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL0RlbGV0ZUtleUFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL0RlbGV0ZUtleUFjdGlvbi5qYXZhCmluZGV4IDgzYzhhZDkuLmMzOGM3OTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9EZWxldGVLZXlBY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvRGVsZXRlS2V5QWN0aW9uLmphdmEKQEAgLTEwLDkgKzEwLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlLmFjdGlvbnM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5LZXlUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuaW50ZXJuYWwuS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wbHVnaW4uTWVzc2FnZXNFZGl0b3JQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvRXhwYW5kQWxsQWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvRXhwYW5kQWxsQWN0aW9uLmphdmEKaW5kZXggZTM5MzdmMy4uZWQ5MDE4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL0V4cGFuZEFsbEFjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9FeHBhbmRBbGxBY3Rpb24uamF2YQpAQCAtMTAsNyArMTAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9uczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnBsdWdpbi5NZXNzYWdlc0VkaXRvclBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9GbGF0TW9kZWxBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9GbGF0TW9kZWxBY3Rpb24uamF2YQppbmRleCA0ZWM3NzNiLi45NDJhZGI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvRmxhdE1vZGVsQWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL0ZsYXRNb2RlbEFjdGlvbi5qYXZhCkBAIC0xMCwxMCArMTAsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlLmFjdGlvbnM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuVHJlZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wbHVnaW4uTWVzc2FnZXNFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuS2V5VHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5UcmVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5pbnRlcm5hbC5LZXlUcmVlQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci51dGlsLlVJVXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL1JlbmFtZUtleUFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL1JlbmFtZUtleUFjdGlvbi5qYXZhCmluZGV4IDJkYTY4ZjIuLmE1NWI3NTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9SZW5hbWVLZXlBY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvUmVuYW1lS2V5QWN0aW9uLmphdmEKQEAgLTEwLDggKzEwLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlLmFjdGlvbnM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5LZXlUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuaW50ZXJuYWwuS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wbHVnaW4uTWVzc2FnZXNFZGl0b3JQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJlZmFjdG9yaW5nLlJlbmFtZUtleVByb2Nlc3NvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmVmYWN0b3JpbmcuUmVuYW1lS2V5V2l6YXJkOwpAQCAtMjIsNyArMjIsNyBAQAogCiAvKioKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZQotICoKKyAqIAogICovCiBwdWJsaWMgY2xhc3MgUmVuYW1lS2V5QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RUcmVlQWN0aW9uIHsKIApAQCAtMzAsMjggKzMwLDMwIEBACiAgICAgICogCiAgICAgICovCiAgICAgcHVibGljIFJlbmFtZUtleUFjdGlvbihNZXNzYWdlc0VkaXRvciBlZGl0b3IsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICBzdXBlcihlZGl0b3IsIHRyZWVWaWV3ZXIpOwotICAgICAgICBzZXRUZXh0KE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygia2V5LnJlbmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5nZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5JTUFHRV9SRU5BTUUpKTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQoIlRPRE8gcHV0IHNvbWV0aGluZyBoZXJlIik7IC8vVE9ETyBwdXQgdG9vbHRpcAorCXN1cGVyKGVkaXRvciwgdHJlZVZpZXdlcik7CisJc2V0VGV4dChNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoImtleS5yZW5hbWUiKSArICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKKwlzZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5nZXRJbWFnZURlc2NyaXB0b3IoVUlVdGlscy5JTUFHRV9SRU5BTUUpKTsKKwlzZXRUb29sVGlwVGV4dCgiVE9ETyBwdXQgc29tZXRoaW5nIGhlcmUiKTsgLy8gVE9ETyBwdXQgdG9vbHRpcAogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBLZXlUcmVlTm9kZSBub2RlID0gZ2V0Tm9kZVNlbGVjdGlvbigpOworCUtleVRyZWVOb2RlIG5vZGUgPSBnZXROb2RlU2VsZWN0aW9uKCk7CiAKLSAgICAgICAgLy8gUmVuYW1lIHNpbmdsZSBpdGVtCi0JCVJlbmFtZUtleVByb2Nlc3NvciByZWZhY3RvcmluZyA9IG5ldyBSZW5hbWVLZXlQcm9jZXNzb3Iobm9kZSwgZ2V0QnVuZGxlR3JvdXAoKSk7Ci0JCQotCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lS2V5V2l6YXJkKG5vZGUsIHJlZmFjdG9yaW5nKTsKLQkJdHJ5IHsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcGVyYXRpb249IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24od2l6YXJkKTsKLQkJCW9wZXJhdGlvbi5ydW4oZ2V0U2hlbGwoKSwgIkludHJvZHVjZSBJbmRpcmVjdGlvbiIpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQorCS8vIFJlbmFtZSBzaW5nbGUgaXRlbQorCVJlbmFtZUtleVByb2Nlc3NvciByZWZhY3RvcmluZyA9IG5ldyBSZW5hbWVLZXlQcm9jZXNzb3Iobm9kZSwKKwkJZ2V0QnVuZGxlR3JvdXAoKSk7CisKKwlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lS2V5V2l6YXJkKG5vZGUsIHJlZmFjdG9yaW5nKTsKKwl0cnkgeworCSAgICBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbigKKwkJICAgIHdpemFyZCk7CisJICAgIG9wZXJhdGlvbi5ydW4oZ2V0U2hlbGwoKSwgIkludHJvZHVjZSBJbmRpcmVjdGlvbiIpOworCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCSAgICAvLyBEbyBub3RoaW5nCisJfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9UcmVlTW9kZWxBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvYWN0aW9ucy9UcmVlTW9kZWxBY3Rpb24uamF2YQppbmRleCA5NDY2OGYxLi41YmY5NGNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2FjdGlvbnMvVHJlZU1vZGVsQWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9hY3Rpb25zL1RyZWVNb2RlbEFjdGlvbi5qYXZhCkBAIC0xMCwxMCArMTAsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlLmFjdGlvbnM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuVHJlZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wbHVnaW4uTWVzc2FnZXNFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuS2V5VHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5UcmVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5pbnRlcm5hbC5LZXlUcmVlQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci51dGlsLlVJVXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9LZXlUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2ludGVybmFsL0tleVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL0tleVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9pbnRlcm5hbC9LZXlUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggM2E0YTcwNC4uNGMwM2ZhNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9LZXlUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9pbnRlcm5hbC9LZXlUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTgsMTQgKzgsMTYgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5BYnN0cmFjdEtleVRyZWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5LZXlUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS52aXNpdG9yLklLZXlUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuSUtleVRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLlRyZWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsLkFic3RyYWN0S2V5VHJlZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsLktleVRyZWVOb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwpAQCAtOTgsOSArMTAwLDkgQEAKICAgICAgICAgY2FzZSBUcmVlOgogICAgICAgICAgICAgcmV0dXJuIGtleVRyZWVNb2RlbC5nZXRSb290Tm9kZXMoKTsKICAgICAgICAgY2FzZSBGbGF0OgotICAgICAgICAJZmluYWwgQ29sbGVjdGlvbjxLZXlUcmVlTm9kZT4gYWN0dWFsS2V5cyA9IG5ldyBBcnJheUxpc3Q8S2V5VHJlZU5vZGU+KCk7CisgICAgICAgIAlmaW5hbCBDb2xsZWN0aW9uPElLZXlUcmVlTm9kZT4gYWN0dWFsS2V5cyA9IG5ldyBBcnJheUxpc3Q8SUtleVRyZWVOb2RlPigpOwogICAgICAgICAJSUtleVRyZWVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSUtleVRyZWVWaXNpdG9yKCkgewotICAgICAgICAJCXB1YmxpYyB2b2lkIHZpc2l0S2V5VHJlZU5vZGUoS2V5VHJlZU5vZGUgbm9kZSkgeworICAgICAgICAJCXB1YmxpYyB2b2lkIHZpc2l0S2V5VHJlZU5vZGUoSUtleVRyZWVOb2RlIG5vZGUpIHsKICAgICAgICAgCQkJaWYgKG5vZGUuaXNVc2VkQXNLZXkoKSkgewogICAgICAgICAJCQkJYWN0dWFsS2V5cy5hZGQobm9kZSk7CiAgICAgICAgIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvS2V5VHJlZUNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2ludGVybmFsL0tleVRyZWVDb250cmlidXRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvS2V5VHJlZUNvbnRyaWJ1dG9yLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvaW50ZXJuYWwvS2V5VHJlZUNvbnRyaWJ1dG9yLmphdmEKaW5kZXggY2ZmZTFiZS4uYTlmN2UyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9LZXlUcmVlQ29udHJpYnV0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2ludGVybmFsL0tleVRyZWVDb250cmlidXRvci5qYXZhCkBAIC04LDIzICs4LDI3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZTsKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2ZXI7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5BYnN0cmFjdEtleVRyZWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5JS2V5VHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuSUtleVRyZWVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLlRyZWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsLkFic3RyYWN0S2V5VHJlZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLmludGVybmFsLklLZXlUcmVlTW9kZWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5LZXlUcmVlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuSU1lc3NhZ2VzRWRpdG9yQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvckNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yTWFya2VyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3JNYXJrZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlLklLZXlUcmVlQ29udHJpYnV0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9ucy5BZGRLZXlBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9ucy5EZWxldGVLZXlBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9ucy5SZW5hbWVLZXlBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyVG9vbFRpcFN1cHBvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKQEAgLTQ2LDcgKzUwLDcgQEAKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZQogICoKICAqLwotcHVibGljIGNsYXNzIEtleVRyZWVDb250cmlidXRvciB7CitwdWJsaWMgY2xhc3MgS2V5VHJlZUNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSUtleVRyZWVDb250cmlidXRvciB7CiAKIAlwcml2YXRlIE1lc3NhZ2VzRWRpdG9yIGVkaXRvcjsKICAgICBwcml2YXRlIEFic3RyYWN0S2V5VHJlZU1vZGVsIHRyZWVNb2RlbDsKQEAgLTYyLDggKzY2LDYgQEAKICAgICAgICAgdGhpcy50cmVlVHlwZSA9IFRyZWVUeXBlLlRyZWU7CiAgICAgfQogCi0KLQogICAgIC8qKgogICAgICAqIAogICAgICAqLwpAQCAtNzEsOCArNzMsMTAgQEAKICAgICAgICAgCiAgICAgICAgIEtleVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEtleVRyZWVDb250ZW50UHJvdmlkZXIodHJlZVR5cGUpOwogCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOworCQlDb2x1bW5WaWV3ZXJUb29sVGlwU3VwcG9ydC5lbmFibGVGb3IgKHRyZWVWaWV3ZXIpOwogICAgICAgICB0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEtleVRyZWVMYWJlbFByb3ZpZGVyKGVkaXRvciwgdHJlZU1vZGVsLCBjb250ZW50UHJvdmlkZXIpKTsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOworICAgICAgICBpZiAodHJlZVZpZXdlci5nZXRJbnB1dCgpID09IG51bGwpCisgICAgICAgICAgICB0cmVlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7CiAgICAgICAgIAogICAgICAgICBWaWV3ZXJGaWx0ZXIgb25seVVudXNlZEFuZE1pc3NpbmdLZXlzRmlsdGVyID0gbmV3IE9ubHlVbnN1ZWRBbmRNaXNzaW5nS2V5KCk7CiAgICAgICAgIFZpZXdlckZpbHRlcltdIGZpbHRlcnMgPSB7b25seVVudXNlZEFuZE1pc3NpbmdLZXlzRmlsdGVyfTsKQEAgLTEyNCw3ICsxMjgsNyBAQAogICAgIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIHNob3VsZCBiZSBpbiB0aGUgZmlsdGVyLiBEb2VzIG5vdCBuYXZpZ2F0ZSB0aGUgdHJlZQogICAgIAkgKiBvZiBLZXlUcmVlTm9kZS4gZmFsc2UgdW5sZXNzIHRoZSBub2RlIGlzIGEgbWlzc2luZyBvciB1bnVzZWQga2V5LgogICAgIAkgKi8KLSAgICAJcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJlZExlYWYoS2V5VHJlZU5vZGUgbm9kZSkgeworICAgIAlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlcmVkTGVhZihJS2V5VHJlZU5vZGUgbm9kZSkgewogICAgIAkJTWVzc2FnZXNFZGl0b3JNYXJrZXJzIG1hcmtlcnMgPSBLZXlUcmVlQ29udHJpYnV0b3IudGhpcy5lZGl0b3IuZ2V0TWFya2VycygpOwogICAgIAkJU3RyaW5nIGtleSA9IG5vZGUuZ2V0TWVzc2FnZUtleSgpOwogICAgIAkJYm9vbGVhbiBtaXNzaW5nT3JVbnVzZWQgPSBtYXJrZXJzLmlzTWlzc2luZ09yVW51c2VkS2V5KGtleSk7CkBAIC0yODgsMTUgKzI5MiwyMCBAQAogICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0ZWRLZXlDaGFuZ2VkKFN0cmluZyBvbGRLZXksIFN0cmluZyBuZXdLZXkpIHsKICAgICAgICAgICAgICAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9CiAgICAgICAgICAgICAgICAgICAgICAgICAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgS2V5VHJlZU5vZGUgbm9kZSA9IGZpbmRLZXlUcmVlTm9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLCBwcm92aWRlci5nZXRFbGVtZW50cyhudWxsKSwgbmV3S2V5KTsKLSAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRlc3QgPSBuZXdLZXkuc3BsaXQoIlxcLiIpOwotLy8gICAgICAgICAgICAgICAgdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVzdCksIHRydWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5vZGUpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB0cmVlVmlld2VyLmdldFRyZWUoKS5zaG93U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsgLy8gYWxzdCB3b3JrYXJvdW5kCisgICAgICAgICAgICAgICAgICAgIEtleVRyZWVOb2RlIG5vZGUgPSBmaW5kS2V5VHJlZU5vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIsIHByb3ZpZGVyLmdldEVsZW1lbnRzKG51bGwpLCBuZXdLZXkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAvLyAgICAgICAgICAgICAgICBTdHJpbmdbXSB0ZXN0ID0gbmV3S2V5LnNwbGl0KCJcXC4iKTsKKyAgICAvLyAgICAgICAgICAgICAgICB0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZXN0KSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKwkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgeworCQkJCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obm9kZSksCisJCQkJCQkJCXRydWUpOworCQkJCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2hvd1NlbGVjdGlvbigpOworCQkJCQl9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9KTsKICAgICB9CkBAIC0zNTMsNSArMzYyLDM3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQorCisgICAgcHVibGljIElLZXlUcmVlTm9kZSBnZXRLZXlUcmVlTm9kZShTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRLZXlUcmVlTm9kZShrZXksIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvLyBUT0RPLCB0aGluayBhYm91dCBhIGhhc2htYXAKKyAgICBwcml2YXRlIElLZXlUcmVlTm9kZSBnZXRLZXlUcmVlTm9kZShTdHJpbmcga2V5LCBJS2V5VHJlZU5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IAorICAgICAgICAgICAgZm9yIChJS2V5VHJlZU5vZGUga3RuIDogdHJlZU1vZGVsLmdldFJvb3ROb2RlcygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0ga3RuLmdldE1lc3NhZ2VLZXkoKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGt0bjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRLZXlUcmVlTm9kZShrZXksIGt0bik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChJS2V5VHJlZU5vZGUga3RuIDogbm9kZS5nZXRDaGlsZHJlbigpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0ga3RuLmdldE1lc3NhZ2VLZXkoKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGt0bjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRLZXlUcmVlTm9kZShrZXksIGt0bik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBJS2V5VHJlZU5vZGVbXSBnZXRSb290S2V5SXRlbXMoKSB7CisgICAgICAgIHJldHVybiB0cmVlTW9kZWwuZ2V0Um9vdE5vZGVzKCk7CisgICAgfQogICAgIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9LZXlUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9pbnRlcm5hbC9LZXlUcmVlTGFiZWxQcm92aWRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzMlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvS2V5VHJlZUxhYmVsUHJvdmlkZXIuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9pbnRlcm5hbC9LZXlUcmVlTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDI5NWI2ZDcuLmVmNGJmYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvS2V5VHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL2ludGVybmFsL0tleVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTgsMjMgKzgsMjcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLmNoZWNrcy5JTWVzc2FnZUNoZWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLkFic3RyYWN0S2V5VHJlZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLktleVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3JNYXJrZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLklLZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5BYnN0cmFjdEtleVRyZWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5pbnRlcm5hbC5LZXlUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmludGVybmFsLk1lc3NhZ2VzRWRpdG9yTWFya2VyczsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5PdmVybGF5SW1hZ2VJY29uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci51dGlsLlVJVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGlvbk92ZXJsYXlJY29uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGb250UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKQEAgLTM0LDcgKzM4LDcgQEAKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZQogICovCiBwdWJsaWMgY2xhc3MgS2V5VHJlZUxhYmVsUHJvdmlkZXIgCi0gICAgICAgIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElGb250UHJvdmlkZXIsIElDb2xvclByb3ZpZGVyIHsJCisgICAgICAgIGV4dGVuZHMgQ29sdW1uTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElGb250UHJvdmlkZXIsIElDb2xvclByb3ZpZGVyIHsJCiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZX0RFRkFVTFQgPSAxIDw8IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWV9DT01NRU5URUQgPSAxIDw8IDI7CkBAIC04MSwxOCArODUsMjggQEAKIAkJCUtleVRyZWVOb2RlIG5vZGUgPSAoS2V5VHJlZU5vZGUpZWxlbWVudDsKIAkJCUNvbGxlY3Rpb248SU1lc3NhZ2VDaGVjaz4gYyA9IGVkaXRvci5nZXRNYXJrZXJzKCkuZ2V0RmFpbGVkQ2hlY2tzKG5vZGUuZ2V0TWVzc2FnZUtleSgpKTsKIAkJCWlmIChjID09IG51bGwgfHwgYy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX0tFWSk7CisJCQkJLy8gUmV0dXJuIHRoZSBkZWZhdWx0IGtleSBpbWFnZSBhcyBubyBpc3N1ZSBleGlzdHMKKwkJCQlyZXR1cm4gVUlVdGlscy5nZXRLZXlJbWFnZSgpOwogCQkJfQotCQkJYm9vbGVhbiBpc01pc3NpbmdPclVudXNlZCA9IGVkaXRvci5nZXRNYXJrZXJzKCkuaXNNaXNzaW5nT3JVbnVzZWRLZXkobm9kZS5nZXRNZXNzYWdlS2V5KCkpOwotCQkJaWYgKGlzTWlzc2luZ09yVW51c2VkKSB7Ci0JCQkJaWYgKGVkaXRvci5nZXRNYXJrZXJzKCkuaXNVbnVzZWRLZXkobm9kZS5nZXRNZXNzYWdlS2V5KCksIGlzTWlzc2luZ09yVW51c2VkKSkgewotCQkJCQlyZXR1cm4gVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX1VOVVNFRF9UUkFOU0xBVElPTik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIFVJVXRpbHMuZ2V0SW1hZ2UoVUlVdGlscy5JTUFHRV9NSVNTSU5HX1RSQU5TTEFUSU9OKTsKKwkJCWlmIChlZGl0b3IuZ2V0TWFya2VycygpLmlzVW51c2VkS2V5KG5vZGUuZ2V0TWVzc2FnZUtleSgpLCBmYWxzZSkpIHsKKwkJCQlpZiAoZWRpdG9yLmdldE1hcmtlcnMoKS5pc01pc3NpbmdLZXkobm9kZS5nZXRNZXNzYWdlS2V5KCkpKXsKKwkJCQkJcmV0dXJuIFVJVXRpbHMuZ2V0TWlzc2luZ0FuZFVudXNlZFRyYW5zbGF0aW9uc0ltYWdlKCk7CisJCQkJfSBlbHNlIGlmIChlZGl0b3IuZ2V0TWFya2VycygpLmlzRHVwbGljYXRlVmFsdWUobm9kZS5nZXRNZXNzYWdlS2V5KCkpKSB7CisJCQkJCXJldHVybiBVSVV0aWxzLmdldER1cGxpY2F0ZUVudHJ5QW5kVW51c2VkVHJhbnNsYXRpb25zSW1hZ2UoKTsKIAkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBVSVV0aWxzLmdldEltYWdlKFVJVXRpbHMuSU1BR0VfV0FSTkVEX1RSQU5TTEFUSU9OKTsKKwkJCQlyZXR1cm4gVUlVdGlscy5nZXRVbnVzZWRUcmFuc2xhdGlvbnNJbWFnZSgpOworCQkJfSBlbHNlIGlmIChlZGl0b3IuZ2V0TWFya2VycygpLmlzTWlzc2luZ0tleShub2RlLmdldE1lc3NhZ2VLZXkoKSkpeworCQkJCXJldHVybiBVSVV0aWxzLmdldE1pc3NpbmdUcmFuc2xhdGlvbkltYWdlKCk7CisJCQl9IGVsc2UgaWYgKGVkaXRvci5nZXRNYXJrZXJzKCkuaXNEdXBsaWNhdGVWYWx1ZShub2RlLmdldE1lc3NhZ2VLZXkoKSkpIHsKKwkJCQlyZXR1cm4gVUlVdGlscy5nZXREdXBsaWNhdGVFbnRyeUltYWdlKCk7CiAJCQl9CisJCQkKKwkJCS8vIFRoaXMgc2hvdWxkbnQgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlIGEgZGVmYXVsdCBrZXkgd2l0aCBhIHdhcm5pbmcgaWNvbiB3aWxsIGJlIHNob3dlZAorCQkJSW1hZ2Ugc29tZVdhcm5pbmcgPSBVSVV0aWxzLmdldEtleUltYWdlKCk7CisJCQlJbWFnZURlc2NyaXB0b3Igd2FybmluZyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UoVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX1dBUk5JTkcpKTsKKwkJCXNvbWVXYXJuaW5nID0gbmV3IERlY29yYXRpb25PdmVybGF5SWNvbihzb21lV2FybmluZywgd2FybmluZywgSURlY29yYXRpb24uQk9UVE9NX1JJR0hUKS5jcmVhdGVJbWFnZSgpOworCQkJcmV0dXJuIHNvbWVXYXJuaW5nOworCQkJLy9yZXR1cm4gVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX1dBUk5FRF9UUkFOU0xBVElPTik7CiAJCX0gZWxzZSB7CiAvKgkgICAgICAgIC8vIEZpZ3VyZSBvdXQgYmFja2dyb3VuZCBpY29uCiAJICAgICAgICBpZiAobWVzc2FnZXNCdW5kbGVHcm91cC5pc01lc3NhZ2VLZXkoa2V5KSkgewpAQCAtMTA2LDkgKzEyMCwxMCBAQAogCSAgICAgICAgfSBlbHNlIHsKIAkgICAgICAgICAgICBpY29uRmxhZ3MgKz0gS0VZX1ZJUlRVQUw7CiAJICAgICAgICB9Ki8KLQkJCXJldHVybiBVSVV0aWxzLmdldEltYWdlKFVJVXRpbHMuSU1BR0VfS0VZKTsKKwkJCQorCQkJcmV0dXJuIFVJVXRpbHMuZ2V0S2V5SW1hZ2UoKTsKKwkJCQogCQl9Ci0JCQogCX0KIAogCkBAIC0xMzEsNiArMTQ2LDI4IEBACiAgICAgCQlyZXR1cm4gImVycm9yIjsKICAgICAgICAgfQogCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgS2V5VHJlZU5vZGUpIHsKKwkJCUtleVRyZWVOb2RlIG5vZGUgPSAoS2V5VHJlZU5vZGUpZWxlbWVudDsKKwkJCUNvbGxlY3Rpb248SU1lc3NhZ2VDaGVjaz4gYyA9IGVkaXRvci5nZXRNYXJrZXJzKCkuZ2V0RmFpbGVkQ2hlY2tzKG5vZGUuZ2V0TWVzc2FnZUtleSgpKTsKKwkJCWlmIChjID09IG51bGwgfHwgYy5pc0VtcHR5KCkpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWJvb2xlYW4gaXNNaXNzaW5nT3JVbnVzZWQgPSBlZGl0b3IuZ2V0TWFya2VycygpLmlzTWlzc2luZ09yVW51c2VkS2V5KG5vZGUuZ2V0TWVzc2FnZUtleSgpKTsKKwkJCWlmIChpc01pc3NpbmdPclVudXNlZCkgeworCQkJCWlmIChlZGl0b3IuZ2V0TWFya2VycygpLmlzVW51c2VkS2V5KG5vZGUuZ2V0TWVzc2FnZUtleSgpLCBpc01pc3NpbmdPclVudXNlZCkpIHsKKwkJCQkJcmV0dXJuICJUaGlzIExvY2FsZSBpcyB1bnVzZWQiOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiAiVGhpcyBMb2NhbGUgaGFzIG1pc3NpbmcgdHJhbnNsYXRpb25zIjsKKwkJCQl9CisJCQl9CisJCQlpZiAoZWRpdG9yLmdldE1hcmtlcnMoKS5pc0R1cGxpY2F0ZVZhbHVlKG5vZGUuZ2V0TWVzc2FnZUtleSgpKSkgeworCQkJCXJldHVybiAiVGhpcyBMb2NhbGUgaGFzIGEgZHVwbGljYXRlIHZhbHVlIjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CiAKICAgICAvKioKICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQpAQCAtMjE0LDEyICsyNTEsMTIgQEAKICAgICAgICAgcmV0dXJuIGltYWdlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc09uZUNoaWxkcmVuTWFya2VkKEtleVRyZWVOb2RlIHBhcmVudE5vZGUpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPbmVDaGlsZHJlbk1hcmtlZChJS2V5VHJlZU5vZGUgcGFyZW50Tm9kZSkgewogICAgICAgICBNZXNzYWdlc0VkaXRvck1hcmtlcnMgbWFya2VycyA9IGVkaXRvci5nZXRNYXJrZXJzKCk7Ci0gICAgICAgIEtleVRyZWVOb2RlW10gY2hpbGROb2RlcyA9IAorICAgICAgICBJS2V5VHJlZU5vZGVbXSBjaGlsZE5vZGVzID0gCiAgICAgICAgICAgICAgICAgZWRpdG9yLmdldEtleVRyZWVNb2RlbCgpLmdldENoaWxkcmVuKHBhcmVudE5vZGUpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEtleVRyZWVOb2RlIG5vZGUgPSBjaGlsZE5vZGVzW2ldOworICAgICAgICAgICAgSUtleVRyZWVOb2RlIG5vZGUgPSBjaGlsZE5vZGVzW2ldOwogICAgICAgICAgICAgaWYgKG1hcmtlcnMuaXNNYXJrZWQobm9kZS5nZXRNZXNzYWdlS2V5KCkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci91dGlsL1VJVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3V0aWwvVUlVdGlscy5qYXZhCmluZGV4IDA3YzM3NWIuLmFlNmUzOGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3V0aWwvVUlVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3V0aWwvVUlVdGlscy5qYXZhCkBAIC0zNyw2ICszNyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpb25PdmVybGF5SWNvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7CkBAIC0xMDAsMTMgKzEwMiwyMSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0VNUFRZID0KICAgICAJCSJlbXB0eS5naWYiOyAgLy8kTk9OLU5MUy0xJAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX01JU1NJTkdfVFJBTlNMQVRJT04gPQotCQkJIm1pc3NpbmdfdHJhbnNsYXRpb24ucG5nIjsgIC8vJE5PTi1OTFMtMSQKKwkJCSJtaXNzaW5nX3RyYW5zbGF0aW9uLmdpZiI7ICAvLyROT04tTkxTLTEkCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfVU5VU0VEX1RSQU5TTEFUSU9OID0KIAkJCSJ1bnVzZWRfdHJhbnNsYXRpb24ucG5nIjsgIC8vJE5PTi1OTFMtMSQKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9VTlVTRURfQU5EX01JU1NJTkdfVFJBTlNMQVRJT05TID0KIAkJCSJ1bnVzZWRfYW5kX21pc3NpbmdfdHJhbnNsYXRpb25zLnBuZyI7ICAvLyROT04tTkxTLTEkCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfV0FSTkVEX1RSQU5TTEFUSU9OID0KIAkJCSJ3YXJuZWRfdHJhbnNsYXRpb24ucG5nIjsgIC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9EVVBMSUNBVEUgPQorCQkJImR1cGxpY2F0ZS5naWYiOyAgLy8kTk9OLU5MUy0xJAorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX1dBUk5JTkcgPQorCQkJIndhcm5pbmcuZ2lmIjsgIC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9FUlJPUiA9CisJCQkiZXJyb3JfY28uZ2lmIjsgIC8vJE5PTi1OTFMtMSQKKyAgICAKICAgICAKICAgICAvKiogSW1hZ2UgcmVnaXN0cnkuICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0KQEAgLTQyNiw2ICs0MzYsNjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAcmV0dXJuIEltYWdlIGZvciB0aGUgaWNvbiB0aGF0IGluZGljYXRlcyBhIGtleSB3aXRoIG5vIGlzc3VlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0S2V5SW1hZ2UoKSB7CisgICAgCUltYWdlIGltYWdlID0gVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX0tFWSk7CisgICAgCXJldHVybiBpbWFnZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBJbWFnZSBmb3IgdGhlIGljb24gd2hpY2ggaW5kaWNhdGVzIGEga2V5IHRoYXQgaGFzIG1pc3NpbmcgdHJhbnNsYXRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRNaXNzaW5nVHJhbnNsYXRpb25JbWFnZSgpIHsKKyAgICAJSW1hZ2UgaW1hZ2UgPSBVSVV0aWxzLmdldEltYWdlKFVJVXRpbHMuSU1BR0VfS0VZKTsKKyAgICAJSW1hZ2VEZXNjcmlwdG9yIG1pc3NpbmcgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUltYWdlKFVJVXRpbHMuZ2V0SW1hZ2UoVUlVdGlscy5JTUFHRV9FUlJPUikpOworCQlpbWFnZSA9IG5ldyBEZWNvcmF0aW9uT3ZlcmxheUljb24oaW1hZ2UsIG1pc3NpbmcsIElEZWNvcmF0aW9uLkJPVFRPTV9SSUdIVCkuY3JlYXRlSW1hZ2UoKTsKKyAgICAJcmV0dXJuIGltYWdlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEltYWdlIGZvciB0aGUgaWNvbiB3aGljaCBpbmRpY2F0ZXMgYSBrZXkgdGhhdCBpcyB1bnVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldFVudXNlZFRyYW5zbGF0aW9uc0ltYWdlKCkgeworICAgIAlJbWFnZSBpbWFnZSA9IFVJVXRpbHMuZ2V0SW1hZ2UoVUlVdGlscy5JTUFHRV9VTlVTRURfVFJBTlNMQVRJT04pOworICAgIAlJbWFnZURlc2NyaXB0b3Igd2FybmluZyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UoVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX1dBUk5JTkcpKTsKKwkJaW1hZ2UgPSBuZXcgRGVjb3JhdGlvbk92ZXJsYXlJY29uKGltYWdlLCB3YXJuaW5nLCBJRGVjb3JhdGlvbi5CT1RUT01fUklHSFQpLmNyZWF0ZUltYWdlKCk7CisgICAgCXJldHVybiBpbWFnZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBJbWFnZSBmb3IgdGhlIGljb24gd2hpY2ggaW5kaWNhdGVzIGEga2V5IHRoYXQgaGFzIG1pc3NpbmcgdHJhbnNsYXRpb25zIGFuZCBpcyB1bnVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldE1pc3NpbmdBbmRVbnVzZWRUcmFuc2xhdGlvbnNJbWFnZSgpIHsKKyAgICAJSW1hZ2UgaW1hZ2UgPSBVSVV0aWxzLmdldEltYWdlKFVJVXRpbHMuSU1BR0VfVU5VU0VEX1RSQU5TTEFUSU9OKTsKKyAgICAJSW1hZ2VEZXNjcmlwdG9yIG1pc3NpbmcgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUltYWdlKFVJVXRpbHMuZ2V0SW1hZ2UoVUlVdGlscy5JTUFHRV9FUlJPUikpOworCQlpbWFnZSA9IG5ldyBEZWNvcmF0aW9uT3ZlcmxheUljb24oaW1hZ2UsIG1pc3NpbmcsIElEZWNvcmF0aW9uLkJPVFRPTV9SSUdIVCkuY3JlYXRlSW1hZ2UoKTsKKyAgICAJcmV0dXJuIGltYWdlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEltYWdlIGZvciB0aGUgaWNvbiB3aGljaCBpbmRpY2F0ZXMgYSBrZXkgdGhhdCBoYXMgZHVwbGljYXRlIGVudHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldER1cGxpY2F0ZUVudHJ5SW1hZ2UoKSB7CisgICAgCUltYWdlIGltYWdlID0gVUlVdGlscy5nZXRJbWFnZShVSVV0aWxzLklNQUdFX0tFWSk7CisgICAgCUltYWdlRGVzY3JpcHRvciBtaXNzaW5nID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21JbWFnZShVSVV0aWxzLmdldEltYWdlKFVJVXRpbHMuSU1BR0VfV0FSTklORykpOworCQlpbWFnZSA9IG5ldyBEZWNvcmF0aW9uT3ZlcmxheUljb24oaW1hZ2UsIG1pc3NpbmcsIElEZWNvcmF0aW9uLkJPVFRPTV9SSUdIVCkuY3JlYXRlSW1hZ2UoKTsKKyAgICAJcmV0dXJuIGltYWdlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEltYWdlIGZvciB0aGUgaWNvbiB3aGljaCBpbmRpY2F0ZXMgYSBrZXkgdGhhdCBoYXMgZHVwbGljYXRlIGVudHJpZXMgYW5kIGlzIHVudXNlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RHVwbGljYXRlRW50cnlBbmRVbnVzZWRUcmFuc2xhdGlvbnNJbWFnZSgpIHsKKyAgICAJSW1hZ2UgaW1hZ2UgPSBVSVV0aWxzLmdldEltYWdlKFVJVXRpbHMuSU1BR0VfVU5VU0VEX1RSQU5TTEFUSU9OKTsKKyAgICAJSW1hZ2VEZXNjcmlwdG9yIG1pc3NpbmcgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUltYWdlKFVJVXRpbHMuZ2V0SW1hZ2UoVUlVdGlscy5JTUFHRV9EVVBMSUNBVEUpKTsKKwkJaW1hZ2UgPSBuZXcgRGVjb3JhdGlvbk92ZXJsYXlJY29uKGltYWdlLCBtaXNzaW5nLCBJRGVjb3JhdGlvbi5CT1RUT01fUklHSFQpLmNyZWF0ZUltYWdlKCk7CisgICAgCXJldHVybiBpbWFnZTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUgb3JpZW50YXRpb24gc3VpdGVkIGZvciBhIGdpdmVuIGxvY2FsZS4KICAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUKICAgICAgKiBAcmV0dXJuIDxjb2RlPlNXVC5SSUdIVF9UT19MRUZUPC9jb2RlPiBvciA8Y29kZT5TV1QuTEVGVF9UT19SSUdIVDwvY29kZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ZpZXdzL01lc3NhZ2VzQnVuZGxlR3JvdXBPdXRsaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci92aWV3cy9NZXNzYWdlc0J1bmRsZUdyb3VwT3V0bGluZS5qYXZhCmluZGV4IDE1NzE2MjMuLmU2Zjc3ZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3ZpZXdzL01lc3NhZ2VzQnVuZGxlR3JvdXBPdXRsaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3Ivdmlld3MvTWVzc2FnZXNCdW5kbGVHcm91cE91dGxpbmUuamF2YQpAQCAtMTIsMTIgKzEyLDEyIEBACiAKIAogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci50cmVlLktleVRyZWVDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuaW50ZXJuYWwuTWVzc2FnZXNFZGl0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnRyZWUuYWN0aW9ucy5Db2xsYXBzZUFsbEFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5hY3Rpb25zLkV4cGFuZEFsbEFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5hY3Rpb25zLkZsYXRNb2RlbEFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5hY3Rpb25zLlRyZWVNb2RlbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZS5pbnRlcm5hbC5LZXlUcmVlQ29udHJpYnV0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpZGdldHMvTnVsbGFibGVUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci93aWRnZXRzL051bGxhYmxlVGV4dC5qYXZhCmluZGV4IDY1ZTg0ZTcuLjQ2ZmYyM2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpZGdldHMvTnVsbGFibGVUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3Ivd2lkZ2V0cy9OdWxsYWJsZVRleHQuamF2YQpAQCAtMTAsNiArMTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLndpZGdldHM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwpAQCAtNjAsNiArNjIsOCBAQAogICAgIHB1YmxpYyBOdWxsYWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7CiAgICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwogICAgICAgICB0ZXh0ID0gbmV3IFRleHQodGhpcywgc3R5bGUpOworICAgICAgICB0ZXh0LnNldERhdGEoIlVORE8iLCBuZXcgU3RhY2s8U3RyaW5nPigpKTsKKyAgICAgICAgdGV4dC5zZXREYXRhKCJSRURPIiwgbmV3IFN0YWNrPFN0cmluZz4oKSk7CiAgICAgICAgIGRlZmF1bHRDb2xvciA9IHRleHQuZ2V0QmFja2dyb3VuZCgpOwogICAgICAgICBudWxsQ29sb3IgPSBVSVV0aWxzLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTElHSFRfU0hBRE9XKTsKICAgICAgICAgCkBAIC04OCw2ICs5Miw4IEBACiAgICAgICAgICAgICB0aGlzLnRleHQuc2V0VGV4dCh0ZXh0KTsKICAgICAgICAgICAgIHJlbmRlck5vcm1hbCgpOwogICAgICAgICB9CisgICAgICAgIFN0YWNrPFN0cmluZz4gdW5kb0NhY2hlID0gKFN0YWNrPFN0cmluZz4pIHRoaXMudGV4dC5nZXREYXRhKCJVTkRPIik7CisgICAgICAgIHVuZG9DYWNoZS5wdXNoKHRoaXMudGV4dC5nZXRUZXh0KCkpOwogICAgIH0KICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CiAgICAgICAgIGlmIChpc251bGwpIHsKQEAgLTE3Nyw0ICsxODMsMjMgQEAKICAgICAgICAgdGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7CiAgICAgfQogICAgIAorLy8gICAgcHJpdmF0ZSBjbGFzcyBTYXZlTGlzdGVuZXIgaW1wbGVtZW50cyBJTWVzc2FnZXNFZGl0b3JMaXN0ZW5lciB7CisvLworLy8JCXB1YmxpYyB2b2lkIG9uU2F2ZSgpIHsKKy8vCQkJU3RhY2s8U3RyaW5nPiB1bmRvQ2FjaGUgPSAoU3RhY2s8U3RyaW5nPikgdGV4dC5nZXREYXRhKCJVTkRPIik7CisvLwkJCXVuZG9DYWNoZS5jbGVhcigpOworLy8JCX0KKy8vCisvLwkJcHVibGljIHZvaWQgb25Nb2RpZnkoKSB7CisvLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKy8vCQkJCisvLwkJfQorLy8KKy8vCQlwdWJsaWMgdm9pZCBvblJlc291cmNlQ2hhbmdlZChJTWVzc2FnZXNCdW5kbGUgYnVuZGxlKSB7CisvLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKy8vCQkJCisvLwkJfQorLy8gICAgCQorLy8gICAgfQorICAgIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpemFyZHMvSVJlc291cmNlQnVuZGxlV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci93aXphcmRzL0lSZXNvdXJjZUJ1bmRsZVdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzk3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci93aXphcmRzL0lSZXNvdXJjZUJ1bmRsZVdpemFyZC5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTWFydGluIFJlaXRlcmVyLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1hcnRpbiBSZWl0ZXJlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLndpemFyZHM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlQnVuZGxlV2l6YXJkIHsKKworCXZvaWQgc2V0QnVuZGxlSWQoU3RyaW5nIHJiTmFtZSk7CisKKwl2b2lkIHNldERlZmF1bHRQYXRoKFN0cmluZyBwYXRoTmFtZSk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpemFyZHMvUmVzb3VyY2VCdW5kbGVOZXdXaXphcmRQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci93aXphcmRzL2ludGVybmFsL1Jlc291cmNlQnVuZGxlTmV3V2l6YXJkUGFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpemFyZHMvUmVzb3VyY2VCdW5kbGVOZXdXaXphcmRQYWdlLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpemFyZHMvaW50ZXJuYWwvUmVzb3VyY2VCdW5kbGVOZXdXaXphcmRQYWdlLmphdmEKaW5kZXggZjZkNjM4Yi4uM2UyZThiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3Ivd2l6YXJkcy9SZXNvdXJjZUJ1bmRsZU5ld1dpemFyZFBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci93aXphcmRzL2ludGVybmFsL1Jlc291cmNlQnVuZGxlTmV3V2l6YXJkUGFnZS5qYXZhCkBAIC03LDkgKzcsMTAgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBQYXNjYWwgRXNzaWVtYnJlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBDbGVtZW50ZSBMb2RpLUbDqCAtIGZpeGluZyBidWdzIGFuZCBzZXR0aW5nIGRpYWxvZyBkZWZhdWx0cwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Iud2l6YXJkczsKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLndpemFyZHMuaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCkBAIC0xNyw3ICsxOCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLndpZGdldHMuTG9jYWxlU2VsZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwpAQCAtNTIsMjYgKzU1LDQyIEBACiAgICAgICAgICAgICArIE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygiZWRpdG9yLmRlZmF1bHQiKSAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICArICJdIjsgLy8kTk9OLU5MUy0xJAogICAgIAorICAgIC8qKgorICAgICAqIGNvbnRhaW5zIHRoZSBwYXRoIG9mIHRoZSBmb2xkZXIgaW4gd2hpY2ggdGhlIHJlc291cmNlIGZpbGUgd2lsbCBiZSBjcmVhdGVkCisgICAgICovCiAgICAgcHJpdmF0ZSBUZXh0IGNvbnRhaW5lclRleHQ7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZpbGUKKyAgICAgKi8KICAgICBwcml2YXRlIFRleHQgZmlsZVRleHQ7CiAgICAgcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKICAgICAKICAgICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247CiAgICAgcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotICAgIAorICAgIC8qKgorICAgICAqIENvbnRhaW5zIGFsbCBhZGRlZCBsb2NhbGVzCisgICAgICovCiAgICAgcHJpdmF0ZSBMaXN0IGJ1bmRsZUxvY2FsZXNMaXN0OwogICAgIAogICAgIHByaXZhdGUgTG9jYWxlU2VsZWN0b3IgbG9jYWxlU2VsZWN0b3I7CiAKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0UGF0aCA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRSQk5hbWUgPSAiQXBwbGljYXRpb25SZXNvdXJjZXMiOworICAgIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yIGZvciBTYW1wbGVOZXdXaXphcmRQYWdlLgogICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gd29ya2JlbmNoIHNlbGVjdGlvbgogICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZU5ld1dpemFyZFBhZ2UoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGVOZXdXaXphcmRQYWdlKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZGVmYXVsdFBhdGgsIFN0cmluZyBkZWZhdWx0UkJOYW1lKSB7CiAgICAgICAgIHN1cGVyKCJ3aXphcmRQYWdlIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgc2V0VGl0bGUoTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0U3RyaW5nKCJlZGl0b3Iud2l6LnRpdGxlIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIHNldERlc2NyaXB0aW9uKE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygiZWRpdG9yLndpei5kZXNjIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICAKKyAgICAgICAgaWYgKCEgZGVmYXVsdFBhdGguaXNFbXB0eSgpKQorICAgICAgICAJdGhpcy5kZWZhdWx0UGF0aCA9IGRlZmF1bHRQYXRoOworICAgICAgICBpZiAoISBkZWZhdWx0UkJOYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgCXRoaXMuZGVmYXVsdFJCTmFtZSA9IGRlZmF1bHRSQk5hbWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTAsNiArMTY5LDggQEAKICAgICAgICAgICAgICAgICBzZXRBZGRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKKyAgICAgICAgLy8gYWRkIGEgc2luZ2xlIExvY2FsZSBzbyB0aGF0IHRoZSBidW5kbGVMb2NhbGVzTGlzdCBpc24ndCBlbXB0eSBvbiBzdGFydHVwCisgICAgICAgIGJ1bmRsZUxvY2FsZXNMaXN0LmFkZChERUZBVUxUX0xPQ0FMRSk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTc0LDYgKzE5NSw3IEBACiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewogICAgICAgICAgICAgICAgIGJ1bmRsZUxvY2FsZXNMaXN0LmFkZChnZXRTZWxlY3RlZExvY2FsZUFzU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHNldEFkZEJ1dHRvblN0YXRlKCk7CisgICAgICAgICAgICAgICAgZGlhbG9nQ2hhbmdlZCgpOyAvLyBmb3IgdGhlIGxvY2FsZS1jaGVjawogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIApAQCAtMTg5LDYgKzIxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVMb2NhbGVzTGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwogICAgICAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICBzZXRBZGRCdXR0b25TdGF0ZSgpOworICAgICAgICAgICAgICAgIGRpYWxvZ0NoYW5nZWQoKTsgLy8gZm9yIHRoZSBsb2NhbGUtY2hlY2sKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgfQpAQCAtMjYyLDI2ICsyODUsNDUgQEAKICAgICAgICAgbGFiZWwuc2V0VGV4dCgiW2xvY2FsZV0ucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCiAgICAgfQogICAgIAotICAgIAogICAgIC8qKgogICAgICAqIFRlc3RzIGlmIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBzZWxlY3Rpb24gaXMgYSBzdWl0YWJsZQogICAgICAqIGNvbnRhaW5lciB0byB1c2UuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24hPW51bGwgJiYgc2VsZWN0aW9uLmlzRW1wdHkoKT09ZmFsc2UgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAgICAgaWYgKCEgZGVmYXVsdFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIAljb250YWluZXJUZXh0LnNldFRleHQoZGVmYXVsdFBhdGgpOworICAgICAgICAJCisgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uIT1udWxsICYmIHNlbGVjdGlvbi5pc0VtcHR5KCk9PWZhbHNlICYmIAorICAgICAgICAJCXNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CiAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgICAgIGlmIChzc2VsLnNpemUoKT4xKSByZXR1cm47Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lcjsKLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gKElDb250YWluZXIpb2JqOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gKChJUmVzb3VyY2Upb2JqKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBjb250YWluZXJUZXh0LnNldFRleHQoY29udGFpbmVyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoc3NlbC5zaXplKCk+MSkgeworICAgICAgICAgICAgCXJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKKwkgICAgCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIG9iaikuCisJICAgIAkJCQlnZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7CisJICAgIAkJLy8gY2hlY2sgaWYgc2VsZWN0aW9uIGlzIGEgZmlsZQorCSAgICAJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkgICAgCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKKwkgICAgCQl9CisJICAgIAkJLy8gZmlsbCBmaWxlcGF0aCBjb250YWluZXIKKwkgICAgCQljb250YWluZXJUZXh0LnNldFRleHQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS4KKwkgICAgCQkJCXRvUG9ydGFibGVTdHJpbmcoKSk7CisJICAgIAl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgeyAKKwkgICAgCQkvLyB0aGlzIHdpbGwgbW9zdCBsaWtlbHkgbmV2ZXIgaGFwcGVuIChsZWdhY3kgY29kZSkKKyAgICAgICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoSUNvbnRhaW5lcilvYmo7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAJY29udGFpbmVyID0gKChJUmVzb3VyY2Upb2JqKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGFpbmVyVGV4dC5zZXRUZXh0KGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpLgorICAgICAgICAgICAgICAgIAkJdG9Qb3J0YWJsZVN0cmluZygpKTsKKyAgICAgICAgICAgIH0gCiAgICAgICAgIH0KLSAgICAgICAgZmlsZVRleHQuc2V0VGV4dCgiQXBwbGljYXRpb25SZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAKKyAgICAgICAgZmlsZVRleHQuc2V0VGV4dChkZWZhdWx0UkJOYW1lKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zMDYsNyArMzQ4LDcgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IGJvdGggdGV4dCBmaWVsZHMgYXJlIHNldC4KKyAgICAgKiBFbnN1cmVzIHRoYXQgYm90aCB0ZXh0IGZpZWxkcyBhbmQgdGhlIExvY2FsZSBmaWVsZCBhcmUgc2V0LgogICAgICAqLwogICAgIC8qZGVmYXVsdCovIHZvaWQgZGlhbG9nQ2hhbmdlZCgpIHsKICAgICAgICAgU3RyaW5nIGNvbnRhaW5lciA9IGdldENvbnRhaW5lck5hbWUoKTsKQEAgLTMyOCw2ICszNzAsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgImVkaXRvci53aXouZXJyb3IuZXh0ZW5zaW9uIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgaWYgYXQgbGVhc3Qgb25lIExvY2FsZSBoYXMgYmVlbiBhZGRlZCB0byB0aCBsaXN0CisgICAgICAgIGlmIChidW5kbGVMb2NhbGVzTGlzdC5nZXRJdGVtQ291bnQoKSA8PSAwKSB7CisgICAgICAgIAl1cGRhdGVTdGF0dXMoTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiZWRpdG9yLndpei5lcnJvci5sb2NhbGUiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBpZiB0aGUgY29udGFpbmVyIGZpZWxkIGNvbnRhaW5zIGEgdmFsaWQgcGF0aAorICAgICAgICAvLyBtZWFuaW5nOiBQcm9qZWN0IGV4aXN0cywgYXQgbGVhc3Qgb25lIHNlZ21lbnQsIHZhbGlkIHBhdGgKKyAgICAgICAgUGF0aCBwYXRoQ29udGFpbmVyID0gbmV3IFBhdGgoY29udGFpbmVyKTsKKyAgICAgICAgaWYgKCFwYXRoQ29udGFpbmVyLmlzVmFsaWRQYXRoKGNvbnRhaW5lcikpIHsKKyAgICAgICAgCXVwZGF0ZVN0YXR1cyhNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICJlZGl0b3Iud2l6LmVycm9yLmludmFsaWRwYXRoIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXRoQ29udGFpbmVyLnNlZ21lbnRDb3VudCgpIDwgMSkgeworICAgICAgICAJdXBkYXRlU3RhdHVzKE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgImVkaXRvci53aXouZXJyb3IuaW52YWxpZHBhdGgiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgCXJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFwcm9qZWN0RXhpc3RzKHBhdGhDb250YWluZXIuc2VnbWVudCgwKSkpIHsKKyAgICAgICAgCVN0cmluZyBlcnJvcm1lc3NhZ2UgPSBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICJlZGl0b3Iud2l6LmVycm9yLnByb2plY3Rub3RleGlzdCIpOworICAgICAgICAJZXJyb3JtZXNzYWdlID0gU3RyaW5nLmZvcm1hdChlcnJvcm1lc3NhZ2UsIHBhdGhDb250YWluZXIuc2VnbWVudCgwKSk7CisgICAgICAgIAl1cGRhdGVTdGF0dXMoZXJyb3JtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAJcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAogICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7CiAgICAgfQogCkBAIC0zNzgsNCArNDQ5LDI3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIERFRkFVTFRfTE9DQUxFOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBQcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIKKyAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgLypkZWZhdWx0Ki8gYm9vbGVhbiBwcm9qZWN0RXhpc3RzKFN0cmluZyBwcm9qZWN0TmFtZSkgeworICAgIAlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKyAgICAgICAgUGF0aCBjb250YWluZXJOYW1lUGF0aCA9IG5ldyBQYXRoKCIvIitwcm9qZWN0TmFtZSk7CisgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3QuZmluZE1lbWJlcihjb250YWluZXJOYW1lUGF0aCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgIAlyZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc291cmNlLmV4aXN0cygpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UkJOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgCWRlZmF1bHRSQk5hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UGF0aChTdHJpbmcgcGF0aCkgeworICAgIAlkZWZhdWx0UGF0aCA9IHBhdGg7CisgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpemFyZHMvUmVzb3VyY2VCdW5kbGVXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpemFyZHMvaW50ZXJuYWwvUmVzb3VyY2VCdW5kbGVXaXphcmQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDYwJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci93aXphcmRzL1Jlc291cmNlQnVuZGxlV2l6YXJkLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3dpemFyZHMvaW50ZXJuYWwvUmVzb3VyY2VCdW5kbGVXaXphcmQuamF2YQppbmRleCBmNDU4ZDhiLi5jMDQwMTZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci93aXphcmRzL1Jlc291cmNlQnVuZGxlV2l6YXJkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3Ivd2l6YXJkcy9pbnRlcm5hbC9SZXNvdXJjZUJ1bmRsZVdpemFyZC5qYXZhCkBAIC03LDggKzcsOSBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIFBhc2NhbCBFc3NpZW1icmUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIE1hdHRoaWFzIExldHRtYXllciAtIGFkZGVkIHNldEJ1bmRsZUlkKCkgKyBzZXREZWZhdWx0UGF0aCgpIChmaXhlZCBpc3N1ZSA2MCkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci53aXphcmRzOworcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Iud2l6YXJkcy5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTE3LDggKzE4LDEwIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wcmVmZXJlbmNlcy5Nc2dFZGl0b3JQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Iud2l6YXJkcy5JUmVzb3VyY2VCdW5kbGVXaXphcmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CkBAIC00OSw5ICs1MiwxMiBAQAogICogInByb3BlcnRpZXMiLgogICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlIChwYXNjYWxAZXNzaWVtYnJlLmNvbSkKICAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7CitwdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJUmVzb3VyY2VCdW5kbGVXaXphcmQgewogICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGVOZXdXaXphcmRQYWdlIHBhZ2U7CiAgICAgcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0UmJOYW1lID0gIiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFBhdGggPSAiIjsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yIGZvciBSZXNvdXJjZUJ1bmRsZVdpemFyZC4KQEAgLTY2LDEwICs3MiwxMCBAQAogICAgICAqLwogCiAgICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIHBhZ2UgPSBuZXcgUmVzb3VyY2VCdW5kbGVOZXdXaXphcmRQYWdlKHNlbGVjdGlvbik7CisgICAgICAgIHBhZ2UgPSBuZXcgUmVzb3VyY2VCdW5kbGVOZXdXaXphcmRQYWdlKHNlbGVjdGlvbiwgZGVmYXVsdFBhdGgsIGRlZmF1bHRSYk5hbWUpOwogICAgICAgICBhZGRQYWdlKHBhZ2UpOwogICAgIH0KLQorICAgIAogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICdGaW5pc2gnIGJ1dHRvbiBpcyBwcmVzc2VkIGluCiAgICAgICogdGhlIHdpemFyZC4gV2Ugd2lsbCBjcmVhdGUgYW4gb3BlcmF0aW9uIGFuZCBydW4gaXQKQEAgLTc5LDYgKzg1LDE2IEBACiAgICAgICAgIGZpbmFsIFN0cmluZyBjb250YWluZXJOYW1lID0gcGFnZS5nZXRDb250YWluZXJOYW1lKCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlTmFtZSA9IHBhZ2UuZ2V0RmlsZU5hbWUoKTsKICAgICAgICAgZmluYWwgU3RyaW5nW10gbG9jYWxlcyA9IHBhZ2UuZ2V0TG9jYWxlU3RyaW5ncygpOworICAgICAgICBpZiAoIWZvbGRlckV4aXN0cyhjb250YWluZXJOYW1lKSkgeworICAgICAgICAJLy9zaG93IGNob29zZWRpYWxvZworICAgICAgICAJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICJlZGl0b3Iud2l6LmNyZWF0ZWZvbGRlciIpOworICAgICAgICAJbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQobWVzc2FnZSwgY29udGFpbmVyTmFtZSk7CisgICAgICAgIAlpZighTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShnZXRTaGVsbCgpLCAiQ3JlYXRlIEZvbGRlciIsIG1lc3NhZ2UpKSB7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgCQlyZXR1cm4gZmFsc2U7CisgICAgICAgIAl9CisgICAgICAgIAkKKyAgICAgICAgfQogICAgICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC05Nyw2ICsxMTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBjcmVhdGVGaWxlKGNvbnRhaW5lck5hbWUsIGZpbGVOYW1lLCBtb25pdG9yKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7IC8vIGZpbGUgY3JlYXRpb24gZmFpbGVkCisgICAgICAgICAgICAgICAgICAgIAlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiRXJyb3IiLCAiRXJyb3IgY3JlYXRpbmcgZmlsZSIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIAl0aHJvd0NvcmVFeGNlcHRpb24oIkZpbGUgXCIiK2NvbnRhaW5lck5hbWUrYmFzZU5hbWUrIlwiIGNvdWxkIG5vdCBiZSBjcmVhdGVkIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmlsZSBsYXN0RmlsZSA9IGZpbGU7CiAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CkBAIC0xMjMsMTYgKzE0MywyOSBAQAogICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIFRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IiLCByZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIiwgcmVhbEV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorICAgIC8qCisgICAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCBmb2xkZXIgZXhpc3RzUworICAgICAqLworICAgIC8qZGVmYXVsdCovIGJvb2xlYW4gZm9sZGVyRXhpc3RzKFN0cmluZyBwYXRoKSB7CisgICAgCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmZpbmRNZW1iZXIobmV3IFBhdGgocGF0aCkpOworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAJcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJcmV0dXJuIHJlc291cmNlLmV4aXN0cygpOworICAgICAgICB9CisgICAgfQogICAgIAogICAgIC8qCiAgICAgICogVGhlIHdvcmtlciBtZXRob2QuIEl0IHdpbGwgZmluZCB0aGUgY29udGFpbmVyLCBjcmVhdGUgdGhlCiAgICAgICogZmlsZSBpZiBtaXNzaW5nIG9yIGp1c3QgcmVwbGFjZSBpdHMgY29udGVudHMsIGFuZCBvcGVuCi0gICAgICogdGhlIGVkaXRvciBvbiB0aGUgbmV3bHkgY3JlYXRlZCBmaWxlLgorICAgICAqIHRoZSBlZGl0b3Igb24gdGhlIG5ld2x5IGNyZWF0ZWQgZmlsZS4gV2lsbCBhbHNvIGNyZWF0ZQorICAgICAqIHRoZSBwYXJlbnQgZm9sZGVycyBvZiB0aGUgZmlsZSBpZiB0aGV5IGRvIG5vdCBleGlzdC4KICAgICAgKi8KICAgICAvKmRlZmF1bHQqLyBJRmlsZSBjcmVhdGVGaWxlKAogICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5lck5hbWUsCkBAIC0xNDMsMTIgKzE3NiwzNiBAQAogICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgImVkaXRvci53aXouY3JlYXRpbmciKSArIGZpbGVOYW1lLCAyKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcm9vdC5maW5kTWVtYmVyKG5ldyBQYXRoKGNvbnRhaW5lck5hbWUpKTsKLSAgICAgICAgaWYgKCFyZXNvdXJjZS5leGlzdHMoKSB8fCAhKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikpIHsKLSAgICAgICAgICAgIHRocm93Q29yZUV4Y2VwdGlvbigiQ29udGFpbmVyIFwiIiArIGNvbnRhaW5lck5hbWUgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgZXhpc3QuIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgUGF0aCBjb250YWluZXJOYW1lUGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lck5hbWUpOworICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmZpbmRNZW1iZXIoY29udGFpbmVyTmFtZVBhdGgpOworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAJaWYgKCFjcmVhdGVGb2xkZXIoY29udGFpbmVyTmFtZVBhdGgsIHJvb3QsIG1vbml0b3IpKSB7CisgICAgICAgIAkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIkVycm9yIiwgCisgICAgICAgIAkJCQlTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygKKyAgICAgICAgCQkJCQkJImVkaXRvci53aXouZXJyb3IuY291bGRub3RjcmVhdGVmb2xkZXIiKSwgCisgICAgICAgIAkJCQkJCWNvbnRhaW5lck5hbWUpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAJCXJldHVybiBudWxsOworICAgICAgICAJfQorICAgICAgICB9IGVsc2UgaWYgKCFyZXNvdXJjZS5leGlzdHMoKSB8fCAhKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikpIHsKKyAgICAgICAgICAgIC8vdGhyb3dDb3JlRXhjZXB0aW9uKCJDb250YWluZXIgXCIiICsgY29udGFpbmVyTmFtZSAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgLy8gICAgICAgICsgIlwiIGRvZXMgbm90IGV4aXN0LiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIAlpZiAoIWNyZWF0ZUZvbGRlcihjb250YWluZXJOYW1lUGF0aCwgcm9vdCwgbW9uaXRvcikpIHsKKyAgICAgICAgCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiRXJyb3IiLCAKKyAgICAgICAgCQkJCVN0cmluZy5mb3JtYXQoTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0U3RyaW5nKAorICAgICAgICAJCQkJCQkiZWRpdG9yLndpei5lcnJvci5jb3VsZG5vdGNyZWF0ZWZvbGRlciIpLCAKKyAgICAgICAgCQkJCQkJY29udGFpbmVyTmFtZSkpOyAvLyROT04tTkxTLTEkCisgICAgICAgIAkJcmV0dXJuIG51bGw7CisgICAgICAgIAl9CiAgICAgICAgIH0KLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7CisgICAgICAgIAorICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByb290LmZpbmRNZW1iZXIoY29udGFpbmVyTmFtZVBhdGgpOworICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksICJFcnJvciIsIAorICAgIAkJCQlTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldFN0cmluZygKKyAgICAJCQkJCQkiZWRpdG9yLndpei5lcnJvci5jb3VsZG5vdGNyZWF0ZWZvbGRlciIpLCAKKyAgICAJCQkJCQljb250YWluZXJOYW1lKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAJCXJldHVybiBudWxsOworICAgICAgICB9CiAgICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBjb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gb3BlbkNvbnRlbnRTdHJlYW0oKTsKQEAgLTE2NCwxNyArMjIxLDUyIEBACiAgICAgfQogICAgIAogICAgIC8qCisgICAgICogUmVjdXJzaXZlbHkgY3JlYXRlcyBhbGwgbWlzc2luZyBmb2xkZXJzCisgICAgICovCisgICAgLypkZWZhdWx0Ki8gYm9vbGVhbiBjcmVhdGVGb2xkZXIoUGF0aCBmb2xkZXJQYXRoLCBJV29ya3NwYWNlUm9vdCByb290LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAJSVJlc291cmNlIGJhc2VSZXNvdXJjZSA9IHJvb3QuZmluZE1lbWJlcihmb2xkZXJQYXRoKTsKKyAgICAJaWYgKCEoYmFzZVJlc291cmNlID09IG51bGwpKSB7CisgICAgCQlpZiAoYmFzZVJlc291cmNlLmV4aXN0cygpKSB7CisgICAgCQkJcmV0dXJuIHRydWU7CisgICAgCQl9CisgICAgCX0gZWxzZSB7IC8vIGlmIGZvbGRlciBkb2VzIG5vdCBleGlzdAorICAgIAkJaWYgKGZvbGRlclBhdGguc2VnbWVudENvdW50KCkgPD0gMSkgeworICAgIAkJCXJldHVybiB0cnVlOworICAgIAkJfQorICAgIAkJUGF0aCBvbmVTZWdtZW50TGVzcyA9IChQYXRoKWZvbGRlclBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOyAvLyBnZXQgcGFyZW50CisgICAgCQlpZiAoY3JlYXRlRm9sZGVyKG9uZVNlZ21lbnRMZXNzLCByb290LCBtb25pdG9yKSkgeyAvLyBjcmVhdGUgcGFyZW50IGZvbGRlcgorICAgIAkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3QuZmluZE1lbWJlcihvbmVTZWdtZW50TGVzcyk7CisgICAgCQkJaWYgKHJlc291cmNlICA9PSBudWxsKSB7CisgICAgCQkJCXJldHVybiBmYWxzZTsgLy8gcmVzb3VyY2UgaXMgbnVsbAorICAgIAkJCX0gZWxzZSBpZiAoIXJlc291cmNlLmV4aXN0cygpIHx8ICEocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSkgeworICAgIAkJCQlyZXR1cm4gZmFsc2U7IC8vIHJlc291cmNlIGRvZXMgbm90IGV4aXN0CisgICAgCQkJfQorICAgIAkJCWZpbmFsIElGb2xkZXIgZm9sZGVyID0gcm9vdC5nZXRGb2xkZXIoZm9sZGVyUGF0aCk7CisgICAgCQkJdHJ5IHsKKwkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKyAgICAJCQlyZXR1cm4gdHJ1ZTsKKyAgICAJCX0gZWxzZSB7CisgICAgCQkJcmV0dXJuIGZhbHNlOyAvLyBjb3VsZCBub3QgY3JlYXRlIHBhcmVudCBmb2xkZXIgb2YgdGhlIGlucHV0IHBhdGgKKyAgICAJCX0KKyAgICAJfQorICAgIAlyZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoKICAgICAgKiBXZSB3aWxsIGluaXRpYWxpemUgZmlsZSBjb250ZW50cyB3aXRoIGEgc2FtcGxlIHRleHQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBvcGVuQ29udGVudFN0cmVhbSgpIHsKICAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKE1zZ0VkaXRvclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuaXNTaG93U3VwcG9ydEVuYWJsZWQoKSkgeworICAgICAgICBpZiAoTXNnRWRpdG9yUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5nZXRTZXJpYWxpemVyQ29uZmlnKCkuaXNTaG93U3VwcG9ydEVuYWJsZWQoKSkgewogLy8gICAgICAgICAgICBjb250ZW50cyA9IFByb3BlcnRpZXNHZW5lcmF0b3IuR0VORVJBVEVEX0JZOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudHMuZ2V0Qnl0ZXMoKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93Q29yZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdGhyb3dDb3JlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAKICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yIiwgIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKQEAgLTE5MCw0ICsyODIsMTIgQEAKICAgICAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3RTZWxlY3Rpb24pIHsKICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzdHJ1Y3RTZWxlY3Rpb247CiAgICAgfQorCisJcHVibGljIHZvaWQgc2V0QnVuZGxlSWQoU3RyaW5nIHJiTmFtZSkgeworCQlkZWZhdWx0UmJOYW1lID0gcmJOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRQYXRoKFN0cmluZyBwYXRoTmFtZSkgeworCQlkZWZhdWx0UGF0aCA9IHBhdGhOYW1lOworCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZGlhbG9ncy9FZGl0UmVzb3VyY2VCdW5kbGVFbnRyaWVzRGlhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZGlhbG9ncy9FZGl0UmVzb3VyY2VCdW5kbGVFbnRyaWVzRGlhbG9nLmphdmEKaW5kZXggOGNhYjRjZi4uMWFkMDU1NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL2RpYWxvZ3MvRWRpdFJlc291cmNlQnVuZGxlRW50cmllc0RpYWxvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9kaWFsb2dzL0VkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2cuamF2YQpAQCAtMTMsMTAgKzEzLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlc0J1bmRsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2UuSU1lc3NhZ2VzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLlByb3BlcnRpZXNJRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5pbnRlcm5hbC5Qcm9wZXJ0aWVzSUZpbGVSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLlByb3BlcnRpZXNEZXNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLnNlci5Qcm9wZXJ0aWVzU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwpAQCAtMjM2LDggKzIzNiw4IEBACiAKIAkJICAgICAgICAgICAgICAgIElNZXNzYWdlc1Jlc291cmNlIG1lc3NhZ2VzUmVzb3VyY2UgPSBuZXcgUHJvcGVydGllc0lGaWxlUmVzb3VyY2UoCiAJCSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmxvY2FsZSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNTZXJpYWxpemVyKHByZWZzKSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNEZXNlcmlhbGl6ZXIocHJlZnMpLAorCQkgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydGllc1NlcmlhbGl6ZXIocHJlZnMuZ2V0U2VyaWFsaXplckNvbmZpZygpKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNEZXNlcmlhbGl6ZXIocHJlZnMuZ2V0RGVzZXJpYWxpemVyQ29uZmlnKCkpLAogCQkgICAgICAgICAgICAgICAgICAgICAgICAoSUZpbGUpIHJlc291cmNlLCBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkpOwogCQkgICAgICAgICAgICAgICAgTWVzc2FnZXNCdW5kbGUgYnVuZGxlID0gbmV3IE1lc3NhZ2VzQnVuZGxlKG1lc3NhZ2VzUmVzb3VyY2UpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZWRpdG9yL0xvY2FsaXphdGlvbkVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL2VkaXRvci9Mb2NhbGl6YXRpb25FZGl0b3IuamF2YQppbmRleCBlMGY1ZWY2Li5mMmI5MjIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZWRpdG9yL0xvY2FsaXphdGlvbkVkaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9lZGl0b3IvTG9jYWxpemF0aW9uRWRpdG9yLmphdmEKQEAgLTEsMTIgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RlZmFuIE38Y2tlIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RlZmFuIE3vv71ja2UgYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAgKgogICogQ29udHJpYnV0b3JzOgotICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZWZhbiBN77+9Y2tlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5lZGl0b3I7CiAKQEAgLTExMywxMCArMTEzLDEyIEBACiAJCQl0aGlzLmNvbHVtbkNvbmZpZyA9IGNvbHVtbkNvbmZpZzsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKIAkJCVJlc291cmNlQnVuZGxlS2V5IGtleSA9IChSZXNvdXJjZUJ1bmRsZUtleSkgZWxlbWVudDsKLQkJCWlmIChjb2x1bW5Db25maWcgPT0gS0VZKQorCQkJaWYgKGNvbHVtbkNvbmZpZyA9PSBLRVkpIHsKIAkJCQlyZXR1cm4ga2V5LmdldE5hbWUoKTsKKwkJCX0KIAkJCUxvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBjb2x1bW5Db25maWc7CiAJCQlTdHJpbmcgdmFsdWU7CiAJCQl0cnkgewpAQCAtMTI1LDggKzEyNyw5IEBACiAJCQkJdmFsdWUgPSBudWxsOwogCQkJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZyhlKTsKIAkJCX0KLQkJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJaWYgKHZhbHVlID09IG51bGwpIHsKIAkJCQl2YWx1ZSA9ICIiOworCQkJfQogCQkJcmV0dXJuIHZhbHVlOwogCQl9CiAJfQpAQCAtMTM5LDYgKzE0Miw3IEBACiAJCS8qCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCVJlc291cmNlQnVuZGxlS2V5IGtleSA9IGdldFNlbGVjdGVkRW50cnkoKTsKIAkJCWlmIChrZXkgPT0gbnVsbCkgewpAQCAtMTQ2LDcgKzE1MCw4IEBACiAJCQl9CiAJCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7CiAJCQlMb2NhbGVbXSBsb2NhbGVzID0gZ2V0TG9jYWxlcygpOwotCQkJRWRpdFJlc291cmNlQnVuZGxlRW50cmllc0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdFJlc291cmNlQnVuZGxlRW50cmllc0RpYWxvZyhzaGVsbCwgbG9jYWxlcyk7CisJCQlFZGl0UmVzb3VyY2VCdW5kbGVFbnRyaWVzRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0UmVzb3VyY2VCdW5kbGVFbnRyaWVzRGlhbG9nKAorCQkJICAgICAgICBzaGVsbCwgbG9jYWxlcyk7CiAJCQlkaWFsb2cuc2V0UmVzb3VyY2VCdW5kbGVLZXkoa2V5KTsKIAkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewogCQkJCXVwZGF0ZUxhYmVscygpOwpAQCAtMTU2LDI0ICsxNjEsMjggQEAKIAogCXByaXZhdGUgY2xhc3MgQ29uZmlndXJlQ29sdW1uc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CiAJCXB1YmxpYyBDb25maWd1cmVDb2x1bW5zQWN0aW9uKCkgewotCQkJc3VwZXIobnVsbCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKLQkJCXNldEltYWdlRGVzY3JpcHRvcihNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9jb25mX2NvbHVtbnMuZ2lmIikpOworCQkJc3VwZXIobnVsbCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7CisJCQlzZXRJbWFnZURlc2NyaXB0b3IoTWVzc2FnZXNFZGl0b3JQbHVnaW4KKwkJCSAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2NvbmZfY29sdW1ucy5naWYiKSk7CiAJCQlzZXRUb29sVGlwVGV4dCgiQ29uZmlndXJlIENvbHVtbnMiKTsKIAkJfQogCiAJCS8qCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKIAkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbY29sdW1uQ29uZmlncy5sZW5ndGhdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db25maWdzLmxlbmd0aDsgaSsrKSB7CiAJCQkJU3RyaW5nIGNvbmZpZyA9IGNvbHVtbkNvbmZpZ3NbaV0udG9TdHJpbmcoKTsKLQkJCQlpZiAoY29uZmlnLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoY29uZmlnLmVxdWFscygiIikpIHsKIAkJCQkJY29uZmlnID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCisJCQkJfQogCQkJCXZhbHVlc1tpXSA9IGNvbmZpZzsKIAkJCX0KLQkJCUNvbmZpZ3VyZUNvbHVtbnNEaWFsb2cgZGlhbG9nID0gbmV3IENvbmZpZ3VyZUNvbHVtbnNEaWFsb2coc2hlbGwsIHZhbHVlcyk7CisJCQlDb25maWd1cmVDb2x1bW5zRGlhbG9nIGRpYWxvZyA9IG5ldyBDb25maWd1cmVDb2x1bW5zRGlhbG9nKHNoZWxsLAorCQkJICAgICAgICB2YWx1ZXMpOwogCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CiAJCQkJU3RyaW5nW10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwogCQkJCU9iamVjdFtdIG5ld0NvbmZpZ3MgPSBuZXcgT2JqZWN0W3Jlc3VsdC5sZW5ndGhdOwpAQCAtMTkzLDE0ICsyMDIsMTYgQEAKIAogCXByaXZhdGUgY2xhc3MgRWRpdEZpbHRlck9wdGlvbnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewogCQlwdWJsaWMgRWRpdEZpbHRlck9wdGlvbnNBY3Rpb24oKSB7Ci0JCQlzdXBlcihudWxsLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2ZpbHRlcl9vYmouZ2lmIikpOworCQkJc3VwZXIobnVsbCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7CisJCQlzZXRJbWFnZURlc2NyaXB0b3IoTWVzc2FnZXNFZGl0b3JQbHVnaW4KKwkJCSAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2ZpbHRlcl9vYmouZ2lmIikpOwogCQkJc2V0VG9vbFRpcFRleHQoIkVkaXQgRmlsdGVyIE9wdGlvbnMiKTsKIAkJfQogCiAJCS8qCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKIAkJCUZpbHRlck9wdGlvbnNEaWFsb2cgZGlhbG9nID0gbmV3IEZpbHRlck9wdGlvbnNEaWFsb2coc2hlbGwpOwpAQCAtMjE1LDE0ICsyMjYsMTYgQEAKIAogCXByaXZhdGUgY2xhc3MgUmVmcmVzaEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CiAJCXB1YmxpYyBSZWZyZXNoQWN0aW9uKCkgewotCQkJc3VwZXIobnVsbCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKLQkJCXNldEltYWdlRGVzY3JpcHRvcihNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9yZWZyZXNoLmdpZiIpKTsKKwkJCXN1cGVyKG51bGwsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOworCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKE1lc3NhZ2VzRWRpdG9yUGx1Z2luCisJCQkgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9yZWZyZXNoLmdpZiIpKTsKIAkJCXNldFRvb2xUaXBUZXh0KCJSZWZyZXNoIik7CiAJCX0KIAogCQkvKgogCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBydW4oKSB7CiAJCQlNZXNzYWdlc0VkaXRvclBsdWdpbi5kaXNwb3NlTW9kZWwoKTsKIAkJCWVudHJ5TGlzdCA9IG5ldyBSZXNvdXJjZUJ1bmRsZUtleUxpc3QobmV3IFJlc291cmNlQnVuZGxlS2V5WzBdKTsKQEAgLTIzMiwxMSArMjQ1LDE0IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIGNsYXNzIEJ1bmRsZVN0cmluZ0NvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFJlc291cmNlQnVuZGxlS2V5PiB7CisJcHJpdmF0ZSBjbGFzcyBCdW5kbGVTdHJpbmdDb21wYXJhdG9yIGltcGxlbWVudHMKKwkgICAgICAgIENvbXBhcmF0b3I8UmVzb3VyY2VCdW5kbGVLZXk+IHsKIAkJcHJpdmF0ZSBmaW5hbCBMb2NhbGUgbG9jYWxlOworCiAJCXB1YmxpYyBCdW5kbGVTdHJpbmdDb21wYXJhdG9yKExvY2FsZSBsb2NhbGUpIHsKIAkJCXRoaXMubG9jYWxlID0gbG9jYWxlOwogCQl9CisKIAkJcHVibGljIGludCBjb21wYXJlKFJlc291cmNlQnVuZGxlS2V5IG8xLCBSZXNvdXJjZUJ1bmRsZUtleSBvMikgewogCQkJU3RyaW5nIHZhbHVlMSA9IG51bGw7CiAJCQlTdHJpbmcgdmFsdWUyID0gbnVsbDsKQEAgLTI1MCw1MyArMjY2LDU5IEBACiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQlNZXNzYWdlc0VkaXRvclBsdWdpbi5sb2coZSk7CiAJCQl9Ci0JCQlpZiAodmFsdWUxID09IG51bGwpCisJCQlpZiAodmFsdWUxID09IG51bGwpIHsKIAkJCQl2YWx1ZTEgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHZhbHVlMiA9PSBudWxsKQorCQkJfQorCQkJaWYgKHZhbHVlMiA9PSBudWxsKSB7CiAJCQkJdmFsdWUyID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KIAkJCXJldHVybiB2YWx1ZTEuY29tcGFyZVRvSWdub3JlQ2FzZSh2YWx1ZTIpOwogCQl9CiAJfQogCiAJcHJpdmF0ZSBjbGFzcyBFeHBvcnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewogCQlwdWJsaWMgRXhwb3J0QWN0aW9uKCkgewotCQkJc3VwZXIobnVsbCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKLQkJCXNldEltYWdlRGVzY3JpcHRvcihNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9leHBvcnQuZ2lmIikpOworCQkJc3VwZXIobnVsbCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7CisJCQlzZXRJbWFnZURlc2NyaXB0b3IoTWVzc2FnZXNFZGl0b3JQbHVnaW4KKwkJCSAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2V4cG9ydC5naWYiKSk7CiAJCQlzZXRUb29sVGlwVGV4dCgiRXhwb3J0IEN1cnJlbnQgVmlldyB0byBDU1Ygb3IgSFRNTCBGaWxlIik7CiAJCX0KIAogCQkvKgogCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBydW4oKSB7CiAJCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7CiAJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsKTsKIAkJCWRpYWxvZy5zZXRUZXh0KCJFeHBvcnQgRmlsZSIpOwotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi4qIiwgIiouaHRtOyAqLmh0bWwiLCAiKi50eHQ7ICouY3N2In0pOwotCQkJZGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7IkFsbCBGaWxlcyAoKi4qKSIsICJIVE1MIEZpbGUgKCouaHRtOyAqLmh0bWwpIiwKLQkJCQkJIlRhYnVsYXRvciBTZXBhcmF0ZWQgRmlsZSAoKi50eHQ7ICouY3N2KSJ9KTsKKwkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLioiLCAiKi5odG07ICouaHRtbCIsCisJCQkgICAgICAgICIqLnR4dDsgKi5jc3YiIH0pOworCQkJZGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7ICJBbGwgRmlsZXMgKCouKikiLAorCQkJICAgICAgICAiSFRNTCBGaWxlICgqLmh0bTsgKi5odG1sKSIsCisJCQkgICAgICAgICJUYWJ1bGF0b3IgU2VwYXJhdGVkIEZpbGUgKCoudHh0OyAqLmNzdikiIH0pOwogCQkJZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKIAkJCWlmIChmaWxlbmFtZSAhPSBudWxsKSB7CiAJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKIAkJCQkJcHVibGljIHZvaWQgcnVuKCkgewogCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwogCQkJCQkJdHJ5IHsKLQkJCQkJCQlCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksCi0JCQkJCQkJCSJVVEY4IikpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKAorCQkJCQkJCSAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKwkJCQkJCQkgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksICJVVEY4IikpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJYm9vbGVhbiBpc0h0bWwgPSBmaWxlbmFtZS5lbmRzV2l0aCgiLmh0bSIpIHx8IGZpbGVuYW1lLmVuZHNXaXRoKCIuaHRtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJCQlpZiAoaXNIdG1sKSB7CiAJCQkJCQkJCXdyaXRlci53cml0ZSgiIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAiPGh0bWw+XHJcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSsgIjxoZWFkPlxyXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrICI8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+XHJcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSsgIjxzdHlsZT5cclxuIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAidGFibGUge3dpZHRoOjEwMCU7fVxyXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrICJ0ZC5zZXAge2hlaWdodDoxMHB4O2JhY2tncm91bmQ6I0MwQzBDMDt9XHJcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSsgIjwvc3R5bGU+XHJcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSsgIjwvaGVhZD5cclxuIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAiPGJvZHk+XHJcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSsgIjx0YWJsZSB3aWR0aD1cIjEwMCVcIiBib3JkZXI9XCIxXCI+XHJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCSAgICAgICAgKyAiPGh0bWw+XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkgICAgICAgICsgIjxoZWFkPlxyXG4iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJICAgICAgICArICI8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkgICAgICAgICsgIjxzdHlsZT5cclxuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSAgICAgICAgKyAidGFibGUge3dpZHRoOjEwMCU7fVxyXG4iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJICAgICAgICArICJ0ZC5zZXAge2hlaWdodDoxMHB4O2JhY2tncm91bmQ6I0MwQzBDMDt9XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkgICAgICAgICsgIjwvc3R5bGU+XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkgICAgICAgICsgIjwvaGVhZD5cclxuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSAgICAgICAgKyAiPGJvZHk+XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkgICAgICAgICsgIjx0YWJsZSB3aWR0aD1cIjEwMCVcIiBib3JkZXI9XCIxXCI+XHJcbiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJfQogCiAJCQkJCQkJaW50IHNpemUgPSBlbnRyeUxpc3QuZ2V0U2l6ZSgpOwpAQCAtMzEzLDggKzMzNSw5IEBACiAJCQkJCQkJCQkJd3JpdGVyLndyaXRlKCI8dHI+PHRkPiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQl9CiAJCQkJCQkJCQlPYmplY3QgY29uZmlnID0gY29uZmlnc1tqXTsKLQkJCQkJCQkJCWlmICghaXNIdG1sICYmIGogPiAwKQorCQkJCQkJCQkJaWYgKCFpc0h0bWwgJiYgaiA+IDApIHsKIAkJCQkJCQkJCQl3cml0ZXIud3JpdGUoIlx0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCX0KIAkJCQkJCQkJCWlmIChjb25maWcgPT0gS0VZKSB7CiAJCQkJCQkJCQkJd3JpdGVyLndyaXRlKGtleS5nZXROYW1lKCkpOwogCQkJCQkJCQkJfSBlbHNlIHsKQEAgLTMzMiw3ICszNTUsOCBAQAogCQkJCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCQkJCXZhbHVlQ291bnQrKzsKIAkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJd3JpdGVyLndyaXRlKEVkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2cuZXNjYXBlKHZhbHVlKSk7CisJCQkJCQkJCQkJd3JpdGVyLndyaXRlKEVkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2cKKwkJCQkJCQkJCQkgICAgICAgIC5lc2NhcGUodmFsdWUpKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJCWlmIChpc0h0bWwpIHsKIAkJCQkJCQkJCQl3cml0ZXIud3JpdGUoIjwvdGQ+PC90cj5cclxuIik7IC8vJE5PTi1OTFMtMSQKQEAgLTM1MCwyMyArMzc0LDIxIEBACiAJCQkJCQkJfQogCQkJCQkJCXdyaXRlci5jbG9zZSgpOwogCQkJCQkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKLQkJCQkJCQkJCXNoZWxsLAotCQkJCQkJCQkJIkZpbmlzaGVkIiwKLQkJCQkJCQkJCSJGaWxlIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LlxuXG5OdW1iZXIgb2YgZW50cmllcyB3cml0dGVuOiAiCi0JCQkJCQkJCQkJCSsgZW50cnlMaXN0LmdldFNpemUoKQotCQkJCQkJCQkJCQkrICJcbk51bWJlciBvZiB0cmFuc2xhdGlvbnM6ICIKLQkJCQkJCQkJCQkJKyB2YWx1ZUNvdW50Ci0JCQkJCQkJCQkJCSsgIiAoIgotCQkJCQkJCQkJCQkrIG1pc3NpbmdDb3VudAotCQkJCQkJCQkJCQkrICIgbWlzc2luZykiKTsKKwkJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgIkZpbmlzaGVkIiwKKwkJCQkJCQkgICAgICAgICJGaWxlIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LlxuXG5OdW1iZXIgb2YgZW50cmllcyB3cml0dGVuOiAiCisJCQkJCQkJICAgICAgICAgICAgICAgICsgZW50cnlMaXN0LmdldFNpemUoKQorCQkJCQkJCSAgICAgICAgICAgICAgICArICJcbk51bWJlciBvZiB0cmFuc2xhdGlvbnM6ICIKKwkJCQkJCQkgICAgICAgICAgICAgICAgKyB2YWx1ZUNvdW50ICsgIiAoIiArIG1pc3NpbmdDb3VudAorCQkJCQkJCSAgICAgICAgICAgICAgICArICIgbWlzc2luZykiKTsKIAkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQkJCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiRXJyb3IiLCAiRXJyb3Igc2F2aW5nIGZpbGUuIiwgbmV3IFN0YXR1cygKLQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQllLmdldE1lc3NhZ2UoKSwKLQkJCQkJCQkJZSkpOworCQkJCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKKwkJCQkJCQkgICAgICAgIHNoZWxsLAorCQkJCQkJCSAgICAgICAgIkVycm9yIiwKKwkJCQkJCQkgICAgICAgICJFcnJvciBzYXZpbmcgZmlsZS4iLAorCQkJCQkJCSAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAorCQkJCQkJCSAgICAgICAgICAgICAgICBNZXNzYWdlc0VkaXRvclBsdWdpbi5QTFVHSU5fSUQsIGUKKwkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBlKSk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9KTsKQEAgLTM3Niw3ICszOTgsOCBAQAogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UucGRlLm5scy51aS5Mb2NhbGl6YXRpb25FZGl0b3IiOyAvLyROT04tTkxTLTEkCiAKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBLRVkgPSAia2V5IjsgLy8gdXNlZCB0byBpbmRpY2F0ZSB0aGUga2V5IGNvbHVtbgorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEtFWSA9ICJrZXkiOyAvLyB1c2VkIHRvIGluZGljYXRlIHRoZSBrZXkKKwkJCQkJCQkJCQkJICAgLy8gY29sdW1uCiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TRUNUSU9OX05BTUUgPSAib3JnLmVjbGlwc2UucGRlLm5scy51aS5Mb2NhbGl6YXRpb25FZGl0b3IiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU09SVF9PUkRFUiA9ICJzb3J0T3JkZXIiOyAvLyROT04tTkxTLTEkCkBAIC00MDAsNyArNDIzLDcgQEAKIAlwcm90ZWN0ZWQgQ29tcG9zaXRlIHF1ZXJ5Q29tcG9zaXRlOwogCXByb3RlY3RlZCBUZXh0IHF1ZXJ5VGV4dDsKIAotCS8vIFJlc3VsdHMgCisJLy8gUmVzdWx0cwogCXByaXZhdGUgU2VjdGlvbiByZXN1bHRzU2VjdGlvbjsKIAlwcml2YXRlIENvbXBvc2l0ZSB0YWJsZUNvbXBvc2l0ZTsKIAlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7CkBAIC00MTMsNyArNDM2LDggQEAKIAlwcm90ZWN0ZWQgRmlsdGVyT3B0aW9ucyBmaWx0ZXJPcHRpb25zOwogCiAJLyoqCi0JICogQ29sdW1uIGNvbmZpZ3VyYXRpb24uIFZhbHVlcyBtYXkgYmUgZWl0aGVyIDxjb2RlPktFWTwvY29kZT4gb3IgYSB7QGxpbmsgTG9jYWxlfS4KKwkgKiBDb2x1bW4gY29uZmlndXJhdGlvbi4gVmFsdWVzIG1heSBiZSBlaXRoZXIgPGNvZGU+S0VZPC9jb2RlPiBvciBhCisJICoge0BsaW5rIExvY2FsZX0uCiAJICovCiAJcHJvdGVjdGVkIE9iamVjdFtdIGNvbHVtbkNvbmZpZ3M7CiAJLyoqCkBAIC00MjgsNiArNDUyLDcgQEAKIAkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKIAkJCXJldHVybiBydWxlID09IHRoaXM7CiAJCX0KKwogCQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7CiAJCQlyZXR1cm4gcnVsZSA9PSB0aGlzOwogCQl9CkBAIC00MzksNyArNDY0LDggQEAKIAl9CiAKIAlwdWJsaWMgUmVzb3VyY2VCdW5kbGVLZXkgZ2V0U2VsZWN0ZWRFbnRyeSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcgorCQkgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKIAkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewogCQkJcmV0dXJuIChSZXNvdXJjZUJ1bmRsZUtleSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwogCQl9CkBAIC00NTksNyArNDg1LDggQEAKIAkJZm9ybS5zZXRTZXBhcmF0b3JWaXNpYmxlKHRydWUpOwogCQlmb3JtLnNldFRleHQoIkxvY2FsaXphdGlvbiIpOwogCi0JCWZvcm0uc2V0SW1hZ2UoZm9ybUltYWdlID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJvYmoxNi9ubHNfZWRpdG9yLmdpZiIpLmNyZWF0ZUltYWdlKCkpOyAvLyROT04tTkxTLTEkCisJCWZvcm0uc2V0SW1hZ2UoZm9ybUltYWdlID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKAorCQkgICAgICAgICJvYmoxNi9ubHNfZWRpdG9yLmdpZiIpLmNyZWF0ZUltYWdlKCkpOyAvLyROT04tTkxTLTEkCiAJCXRvb2xraXQuYWRhcHQoZm9ybSk7CiAJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGZvcm0pOwogCQlmaW5hbCBDb21wb3NpdGUgYm9keSA9IGZvcm0uZ2V0Qm9keSgpOwpAQCAtNDkyLDggKzUxOSwxMCBAQAogCQl0b29sa2l0LmNyZWF0ZUxhYmVsKHF1ZXJ5Q29tcG9zaXRlLCAiU2VhcmNoOiIpOwogCiAJCS8vIFF1ZXJ5IHRleHQKLQkJcXVlcnlUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHF1ZXJ5Q29tcG9zaXRlLCAiIiwgU1dULldSQVAgfCBTV1QuU0lOR0xFKTsgLy8kTk9OLU5MUy0xJAorCQlxdWVyeVRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQocXVlcnlDb21wb3NpdGUsCisJCSAgICAgICAgIiIsIFNXVC5XUkFQIHwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKIAkJcXVlcnlUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKIAkJCQlpZiAoZS5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSB7CiAJCQkJCXRhYmxlLnNldEZvY3VzKCk7CkBAIC01MjMsMTMgKzU1MiwxNiBAQAogCQl0b29sa2l0LmFkYXB0KGNvbnRyb2wpOwogCiAJCS8vIFJlc3VsdHMgc2VjdGlvbgotCQlyZXN1bHRzU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihib2R5LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUgotCQkJCXwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5MRUZUX1RFWFRfQ0xJRU5UX0FMSUdOTUVOVCk7Ci0JCXJlc3VsdHNTZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOworCQlyZXN1bHRzU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihib2R5LAorCQkgICAgICAgIEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCisJCSAgICAgICAgICAgICAgICB8IEV4cGFuZGFibGVDb21wb3NpdGUuTEVGVF9URVhUX0NMSUVOVF9BTElHTk1FTlQpOworCQlyZXN1bHRzU2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsCisJCSAgICAgICAgdHJ1ZSwgMiwgMSkpOwogCQlyZXN1bHRzU2VjdGlvbi5zZXRUZXh0KCJMb2NhbGl6YXRpb24gU3RyaW5ncyIpOwogCQl0b29sa2l0LmFkYXB0KHJlc3VsdHNTZWN0aW9uKTsKIAotCQlmaW5hbCBDb21wb3NpdGUgcmVzdWx0c0NvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHJlc3VsdHNTZWN0aW9uLCBTV1QuTk9ORSk7CisJCWZpbmFsIENvbXBvc2l0ZSByZXN1bHRzQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoCisJCSAgICAgICAgcmVzdWx0c1NlY3Rpb24sIFNXVC5OT05FKTsKIAkJdG9vbGtpdC5hZGFwdChyZXN1bHRzQ29tcG9zaXRlKTsKIAkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0MiA9IG5ldyBHcmlkTGF5b3V0KCk7CiAJCWdyaWRMYXlvdXQyLm1hcmdpblRvcCA9IDE7CkBAIC01MzksOCArNTcxLDEwIEBACiAJCXJlc3VsdHNDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQyKTsKIAogCQlmaWx0ZXJlZExhYmVsID0gbmV3IExhYmVsKHJlc3VsdHNTZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCWZpbHRlcmVkTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWZpbHRlcmVkTGFiZWwuc2V0Rm9yZWdyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7CisJCWZpbHRlcmVkTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwKKwkJICAgICAgICBmYWxzZSwgZmFsc2UpKTsKKwkJZmlsdGVyZWRMYWJlbC5zZXRGb3JlZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKAorCQkgICAgICAgIFNXVC5DT0xPUl9SRUQpKTsKIAkJZmlsdGVyZWRMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAogCiAJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHJlc3VsdHNDb21wb3NpdGUpOwpAQCAtNTQ4LDkgKzU4MiwxMSBAQAogCQlyZXN1bHRzU2VjdGlvbi5zZXRUZXh0Q2xpZW50KGZpbHRlcmVkTGFiZWwpOwogCiAJCXRhYmxlQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocmVzdWx0c0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0YWJsZUNvbXBvc2l0ZS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVFJFRV9CT1JERVIpOworCQl0YWJsZUNvbXBvc2l0ZS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKKwkJICAgICAgICBGb3JtVG9vbGtpdC5UUkVFX0JPUkRFUik7CiAJCXRvb2xraXQuYWRhcHQodGFibGVDb21wb3NpdGUpOwotCQl0YWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKKwkJdGFibGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLAorCQkgICAgICAgIHRydWUpKTsKIAogCQkvLyBUYWJsZQogCQljcmVhdGVUYWJsZVZpZXdlcigpOwpAQCAtNTYzLDcgKzU5OSw3IEBACiAJCWZpbHRlck9wdGlvbnMucGx1Z2luUGF0dGVybnMgPSBuZXcgU3RyaW5nWzBdOwogCQlmaWx0ZXJPcHRpb25zLmtleXNXaXRoTWlzc2luZ0VudHJpZXNPbmx5ID0gZmFsc2U7CiAJCXNvcnRPcmRlciA9IEtFWTsKLQkJY29sdW1uQ29uZmlncyA9IG5ldyBPYmplY3RbXSB7S0VZLCBuZXcgTG9jYWxlKCIiKSwgbmV3IExvY2FsZSgiZGUiKX07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQljb2x1bW5Db25maWdzID0gbmV3IE9iamVjdFtdIHsgS0VZLCBuZXcgTG9jYWxlKCIiKSwgbmV3IExvY2FsZSgiZGUiKSB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCQkvLyBMb2FkIGNvbmZpZ3VyYXRpb24KIAkJdHJ5IHsKQEAgLTU3OCw3ICs2MTQsOCBAQAogCX0KIAogCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZpbHRlckxhYmVsKCkgewotCQlpZiAoZmlsdGVyT3B0aW9ucy5maWx0ZXJQbHVnaW5zIHx8IGZpbHRlck9wdGlvbnMua2V5c1dpdGhNaXNzaW5nRW50cmllc09ubHkpIHsKKwkJaWYgKGZpbHRlck9wdGlvbnMuZmlsdGVyUGx1Z2lucworCQkgICAgICAgIHx8IGZpbHRlck9wdGlvbnMua2V5c1dpdGhNaXNzaW5nRW50cmllc09ubHkpIHsKIAkJCWZpbHRlcmVkTGFiZWwuc2V0VGV4dCgiKGZpbHRlcmVkKSIpOwogCQl9IGVsc2UgewogCQkJZmlsdGVyZWRMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJApAQCAtNTg4LDEwICs2MjUsMTIgQEAKIAogCXByaXZhdGUgdm9pZCBsb2FkU2V0dGluZ3MoKSB7CiAJCS8vIFRPRE8gTW92ZSB0aGlzIHRvIHRoZSBwcmVmZXJlbmNlcz8KLQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7CisJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKQorCQkgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwogCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IGRpYWxvZ1NldHRpbmdzLmdldFNlY3Rpb24oUFJFRl9TRUNUSU9OX05BTUUpOwotCQlpZiAoc2VjdGlvbiA9PSBudWxsKQorCQlpZiAoc2VjdGlvbiA9PSBudWxsKSB7CiAJCQlyZXR1cm47CisJCX0KIAogCQkvLyBTb3J0IG9yZGVyCiAJCVN0cmluZyBzb3J0T3JkZXJTdHJpbmcgPSBzZWN0aW9uLmdldChQUkVGX1NPUlRfT1JERVIpOwpAQCAtNjEwLDcgKzY0OSw4IEBACiAJCS8vIENvbHVtbnMKIAkJU3RyaW5nIGNvbHVtbnMgPSBzZWN0aW9uLmdldChQUkVGX0NPTFVNTlMpOwogCQlpZiAoY29sdW1ucyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBjb2xzID0gY29sdW1ucy5zdWJzdHJpbmcoMSwgY29sdW1ucy5sZW5ndGgoKSAtIDEpLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZ1tdIGNvbHMgPSBjb2x1bW5zLnN1YnN0cmluZygxLCBjb2x1bW5zLmxlbmd0aCgpIC0gMSkuc3BsaXQoCisJCQkgICAgICAgICIsIik7IC8vJE5PTi1OTFMtMSQKIAkJCWNvbHVtbkNvbmZpZ3MgPSBuZXcgT2JqZWN0W2NvbHMubGVuZ3RoXTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgewogCQkJCVN0cmluZyB2YWx1ZSA9IGNvbHNbaV0udHJpbSgpOwpAQCAtNjMzLDcgKzY3Myw4IEBACiAJCXRoaXMuZmlsdGVyT3B0aW9ucy5maWx0ZXJQbHVnaW5zID0gInRydWUiLmVxdWFscyhmaWx0ZXJPcHRpb25zKTsgLy8kTk9OLU5MUy0xJAogCQlTdHJpbmcgcGF0dGVybnMgPSBzZWN0aW9uLmdldChQUkVGX0ZJTFRFUl9PUFRJT05TX1BMVUdJTl9QQVRURVJOUyk7CiAJCWlmIChwYXR0ZXJucyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzcGxpdCA9IHBhdHRlcm5zLnN1YnN0cmluZygxLCBwYXR0ZXJucy5sZW5ndGgoKSAtIDEpLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZ1tdIHNwbGl0ID0gcGF0dGVybnMuc3Vic3RyaW5nKDEsIHBhdHRlcm5zLmxlbmd0aCgpIC0gMSkKKwkJCSAgICAgICAgLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKIAkJCQlzcGxpdFtpXSA9IHNwbGl0W2ldLnRyaW0oKTsKIAkJCX0KQEAgLTY0MSwxMSArNjgyLDEyIEBACiAJCX0KIAkJdGhpcy5maWx0ZXJPcHRpb25zLmtleXNXaXRoTWlzc2luZ0VudHJpZXNPbmx5ID0gInRydWUiLmVxdWFscyhzZWN0aW9uLmdldChQUkVGX0ZJTFRFUl9PUFRJT05TX01JU1NJTkdfT05MWSkpOyAvLyROT04tTkxTLTEkCiAKLQkJLy8gVE9ETyBTYXZlIGNvbHVtbiB3aWR0aHMgCisJCS8vIFRPRE8gU2F2ZSBjb2x1bW4gd2lkdGhzCiAJfQogCiAJcHJpdmF0ZSB2b2lkIHNhdmVTZXR0aW5ncygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7CisJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKQorCQkgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwogCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IGRpYWxvZ1NldHRpbmdzLmdldFNlY3Rpb24oUFJFRl9TRUNUSU9OX05BTUUpOwogCQlpZiAoc2VjdGlvbiA9PSBudWxsKSB7CiAJCQlzZWN0aW9uID0gZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihQUkVGX1NFQ1RJT05fTkFNRSk7CkBAIC02NTcsMTMgKzY5OSwxNyBAQAogCQlzZWN0aW9uLnB1dChQUkVGX0NPTFVNTlMsIEFycmF5cy50b1N0cmluZyhjb2x1bW5Db25maWdzKSk7CiAKIAkJLy8gRmlsdGVyIG9wdGlvbnMKLQkJc2VjdGlvbi5wdXQoUFJFRl9GSUxURVJfT1BUSU9OU19GSUxURVJfUExVR0lOUywgZmlsdGVyT3B0aW9ucy5maWx0ZXJQbHVnaW5zKTsKLQkJc2VjdGlvbi5wdXQoUFJFRl9GSUxURVJfT1BUSU9OU19QTFVHSU5fUEFUVEVSTlMsIEFycmF5cy50b1N0cmluZyhmaWx0ZXJPcHRpb25zLnBsdWdpblBhdHRlcm5zKSk7Ci0JCXNlY3Rpb24ucHV0KFBSRUZfRklMVEVSX09QVElPTlNfTUlTU0lOR19PTkxZLCBmaWx0ZXJPcHRpb25zLmtleXNXaXRoTWlzc2luZ0VudHJpZXNPbmx5KTsKKwkJc2VjdGlvbi5wdXQoUFJFRl9GSUxURVJfT1BUSU9OU19GSUxURVJfUExVR0lOUywKKwkJICAgICAgICBmaWx0ZXJPcHRpb25zLmZpbHRlclBsdWdpbnMpOworCQlzZWN0aW9uLnB1dChQUkVGX0ZJTFRFUl9PUFRJT05TX1BMVUdJTl9QQVRURVJOUywKKwkJICAgICAgICBBcnJheXMudG9TdHJpbmcoZmlsdGVyT3B0aW9ucy5wbHVnaW5QYXR0ZXJucykpOworCQlzZWN0aW9uLnB1dChQUkVGX0ZJTFRFUl9PUFRJT05TX01JU1NJTkdfT05MWSwKKwkJICAgICAgICBmaWx0ZXJPcHRpb25zLmtleXNXaXRoTWlzc2luZ0VudHJpZXNPbmx5KTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVWaWV3ZXIoKSB7Ci0JCXRhYmxlID0gbmV3IFRhYmxlKHRhYmxlQ29tcG9zaXRlLCBTV1QuVklSVFVBTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7CisJCXRhYmxlID0gbmV3IFRhYmxlKHRhYmxlQ29tcG9zaXRlLCBTV1QuVklSVFVBTCB8IFNXVC5GVUxMX1NFTEVDVElPTgorCQkgICAgICAgIHwgU1dULk1VTFRJKTsKIAkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwogCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwogCQl0b29sa2l0LmFkYXB0KHRhYmxlKTsKQEAgLTY3NCw5ICs3MjAsMTIgQEAKIAkJCXB1YmxpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoaW50IGluZGV4KSB7CiAJCQkJdGFibGVWaWV3ZXIucmVwbGFjZShlbnRyeUxpc3QuZ2V0S2V5KGluZGV4KSwgaW5kZXgpOwogCQkJfQorCiAJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogCQkJfQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisKKwkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCisJCQkgICAgICAgIE9iamVjdCBuZXdJbnB1dCkgewogCQkJfQogCQl9KTsKIAkJdGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7CkBAIC02OTYsNyArNzQ1LDggQEAKIAkJfSk7CiAJCU1lbnUgY29udGV4dE1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSh0YWJsZSk7CiAJCXRhYmxlLnNldE1lbnUoY29udGV4dE1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWFuYWdlciwgZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWFuYWdlciwKKwkJICAgICAgICBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7CiAJfQogCiAJcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7CkBAIC03MDYsOCArNzU2LDEwIEBACiAJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwogCQl9CiAJCU1lbnVNYW5hZ2VyIHNob3dJblN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiZTaG93IEluIik7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5LlZJRVdTX1NIT1dfSU4uY3JlYXRlKHdpbmRvdyk7CisJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQorCQkgICAgICAgIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5LlZJRVdTX1NIT1dfSU4KKwkJICAgICAgICAuY3JlYXRlKHdpbmRvdyk7CiAJCXNob3dJblN1Yk1lbnUuYWRkKGl0ZW0pOwogCQltZW51LmFkZChzaG93SW5TdWJNZW51KTsKIAl9CkBAIC03MjYsNyArNzc4LDggQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKKwkgICAgICAgIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7CiAJCXNldFNpdGUoc2l0ZSk7CiAJCXNldElucHV0KGlucHV0KTsKIAkJdGhpcy5pbnB1dCA9IChMb2NhbGl6YXRpb25FZGl0b3JJbnB1dCkgaW5wdXQ7CkBAIC03ODQsMTQgKzgzNywxNSBAQAogCQkJCQlzdHJQYXR0ZXJuID0gIioiLmNvbmNhdChzdHJQYXR0ZXJuKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KIAotCQkJCVJlc291cmNlQnVuZGxlTW9kZWwgbW9kZWwgPSBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRNb2RlbChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCQlSZXNvdXJjZUJ1bmRsZU1vZGVsIG1vZGVsID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4KKwkJCQkgICAgICAgIC5nZXRNb2RlbChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKIAkJCQlMb2NhbGVbXSBsb2NhbGVzID0gZ2V0TG9jYWxlcygpOwogCiAJCQkJLy8gQ29sbGVjdCBrZXlzCiAJCQkJUmVzb3VyY2VCdW5kbGVLZXlbXSBrZXlzOwogCQkJCWlmICghZmlsdGVyT3B0aW9ucy5maWx0ZXJQbHVnaW5zCi0JCQkJCQl8fCBmaWx0ZXJPcHRpb25zLnBsdWdpblBhdHRlcm5zID09IG51bGwKLQkJCQkJCXx8IGZpbHRlck9wdGlvbnMucGx1Z2luUGF0dGVybnMubGVuZ3RoID09IDApIHsKKwkJCQkgICAgICAgIHx8IGZpbHRlck9wdGlvbnMucGx1Z2luUGF0dGVybnMgPT0gbnVsbAorCQkJCSAgICAgICAgfHwgZmlsdGVyT3B0aW9ucy5wbHVnaW5QYXR0ZXJucy5sZW5ndGggPT0gMCkgewogCiAJCQkJCS8vIEVuc3VyZSB0aGUgYnVuZGxlcyBhcmUgbG9hZGVkCiAJCQkJCWZvciAoTG9jYWxlIGxvY2FsZSA6IGxvY2FsZXMpIHsKQEAgLTgxMiw3ICs4NjYsOCBAQAogCQkJCQlTdHJpbmdbXSBwYXR0ZXJucyA9IGZpbHRlck9wdGlvbnMucGx1Z2luUGF0dGVybnM7CiAJCQkJCVN0cmluZ01hdGNoZXJbXSBtYXRjaGVycyA9IG5ldyBTdHJpbmdNYXRjaGVyW3BhdHRlcm5zLmxlbmd0aF07CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF0Y2hlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCW1hdGNoZXJzW2ldID0gbmV3IFN0cmluZ01hdGNoZXIocGF0dGVybnNbaV0sIHRydWUsIGZhbHNlKTsKKwkJCQkJCW1hdGNoZXJzW2ldID0gbmV3IFN0cmluZ01hdGNoZXIocGF0dGVybnNbaV0sIHRydWUsCisJCQkJCQkgICAgICAgIGZhbHNlKTsKIAkJCQkJfQogCiAJCQkJCWludCBzaXplID0gMDsKQEAgLTgzMywxNCArODg4LDE3IEBACiAJCQkJCQlzaXplICs9IGZhbWlseS5nZXRLZXlDb3VudCgpOwogCQkJCQl9CiAKLQkJCQkJQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PiBmaWx0ZXJlZEtleXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PihzaXplKTsKKwkJCQkJQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PiBmaWx0ZXJlZEtleXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PigKKwkJCQkJICAgICAgICBzaXplKTsKIAkJCQkJZm9yIChSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgOiBmYW1pbGllcykgewogCQkJCQkJLy8gRW5zdXJlIHRoZSBidW5kbGVzIGFyZSBsb2FkZWQKIAkJCQkJCWZvciAoTG9jYWxlIGxvY2FsZSA6IGxvY2FsZXMpIHsKIAkJCQkJCQl0cnkgewotCQkJCQkJCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBmYW1pbHkuZ2V0QnVuZGxlKGxvY2FsZSk7Ci0JCQkJCQkJCWlmIChidW5kbGUgIT0gbnVsbCkKKwkJCQkJCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZmFtaWx5CisJCQkJCQkJCSAgICAgICAgLmdldEJ1bmRsZShsb2NhbGUpOworCQkJCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKIAkJCQkJCQkJCWJ1bmRsZS5sb2FkKCk7CisJCQkJCQkJCX0KIAkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQkJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKGUpOwogCQkJCQkJCX0KQEAgLTg1MSwyNSArOTA5LDMwIEBACiAJCQkJCQkJZmlsdGVyZWRLZXlzLmFkZChrZXkpOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCWtleXMgPSBmaWx0ZXJlZEtleXMudG9BcnJheShuZXcgUmVzb3VyY2VCdW5kbGVLZXlbZmlsdGVyZWRLZXlzLnNpemUoKV0pOworCQkJCQlrZXlzID0gZmlsdGVyZWRLZXlzCisJCQkJCSAgICAgICAgLnRvQXJyYXkobmV3IFJlc291cmNlQnVuZGxlS2V5W2ZpbHRlcmVkS2V5cy5zaXplKCldKTsKIAkJCQl9CiAKIAkJCQkvLyBGaWx0ZXIga2V5cwogCQkJCUFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUtleT4gZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PigpOwogCi0JCQkJU3RyaW5nTWF0Y2hlciBrZXlNYXRjaGVyID0gbmV3IFN0cmluZ01hdGNoZXIoa2V5UGF0dGVybiwgdHJ1ZSwgZmFsc2UpOwotCQkJCVN0cmluZ01hdGNoZXIgc3RyTWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKHN0clBhdHRlcm4sIHRydWUsIGZhbHNlKTsKKwkJCQlTdHJpbmdNYXRjaGVyIGtleU1hdGNoZXIgPSBuZXcgU3RyaW5nTWF0Y2hlcihrZXlQYXR0ZXJuLCB0cnVlLAorCQkJCSAgICAgICAgZmFsc2UpOworCQkJCVN0cmluZ01hdGNoZXIgc3RyTWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKHN0clBhdHRlcm4sIHRydWUsCisJCQkJICAgICAgICBmYWxzZSk7CiAJCQkJZm9yIChSZXNvdXJjZUJ1bmRsZUtleSBrZXkgOiBrZXlzKSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CiAJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCQkJfQogCiAJCQkJCS8vIE1pc3NpbmcgZW50cmllcwogCQkJCQlpZiAoZmlsdGVyT3B0aW9ucy5rZXlzV2l0aE1pc3NpbmdFbnRyaWVzT25seSkgewogCQkJCQkJYm9vbGVhbiBoYXNNaXNzaW5nRW50cnkgPSBmYWxzZTsKIAkJCQkJCS8vIENoZWNrIGFsbCBjb2x1bW5zIGZvciBtaXNzaW5nIHZhbHVlcwogCQkJCQkJZm9yIChPYmplY3QgY29uZmlnIDogY29sdW1uQ29uZmlncykgewotCQkJCQkJCWlmIChjb25maWcgPT0gS0VZKQorCQkJCQkJCWlmIChjb25maWcgPT0gS0VZKSB7CiAJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KIAkJCQkJCQlMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgY29uZmlnOwogCQkJCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7CiAJCQkJCQkJdHJ5IHsKQEAgLTg4Miw4ICs5NDUsOSBAQAogCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCQlpZiAoIWhhc01pc3NpbmdFbnRyeSkKKwkJCQkJCWlmICghaGFzTWlzc2luZ0VudHJ5KSB7CiAJCQkJCQkJY29udGludWU7CisJCQkJCQl9CiAJCQkJCX0KIAogCQkJCQkvLyBNYXRjaCBrZXkKQEAgLTg5NCw4ICs5NTgsOSBAQAogCiAJCQkJCS8vIE1hdGNoIGVudHJpZXMKIAkJCQkJZm9yIChPYmplY3QgY29uZmlnIDogY29sdW1uQ29uZmlncykgewotCQkJCQkJaWYgKGNvbmZpZyA9PSBLRVkpCisJCQkJCQlpZiAoY29uZmlnID09IEtFWSkgewogCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQogCQkJCQkJTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIGNvbmZpZzsKIAkJCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7CiAJCQkJCQl0cnkgewpAQCAtOTEwLDExICs5NzUsMTQgQEAKIAkJCQkJfQogCQkJCX0KIAotCQkJCVJlc291cmNlQnVuZGxlS2V5W10gYXJyYXkgPSBmaWx0ZXJlZC50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZUtleVtmaWx0ZXJlZC5zaXplKCldKTsKKwkJCQlSZXNvdXJjZUJ1bmRsZUtleVtdIGFycmF5ID0gZmlsdGVyZWQKKwkJCQkgICAgICAgIC50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZUtleVtmaWx0ZXJlZC5zaXplKCldKTsKIAkJCQlpZiAoc29ydE9yZGVyID09IEtFWSkgewogCQkJCQlBcnJheXMuc29ydChhcnJheSwgbmV3IENvbXBhcmF0b3I8UmVzb3VyY2VCdW5kbGVLZXk+KCkgewotCQkJCQkJcHVibGljIGludCBjb21wYXJlKFJlc291cmNlQnVuZGxlS2V5IG8xLCBSZXNvdXJjZUJ1bmRsZUtleSBvMikgewotCQkJCQkJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShvMi5nZXROYW1lKCkpOworCQkJCQkJcHVibGljIGludCBjb21wYXJlKFJlc291cmNlQnVuZGxlS2V5IG8xLAorCQkJCQkJICAgICAgICBSZXNvdXJjZUJ1bmRsZUtleSBvMikgeworCQkJCQkJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZSgKKwkJCQkJCQkgICAgICAgIG8yLmdldE5hbWUoKSk7CiAJCQkJCQl9CiAJCQkJCX0pOwogCQkJCX0gZWxzZSB7CkBAIC05MjMsOCArOTkxLDkgQEAKIAkJCQl9CiAJCQkJZW50cnlMaXN0ID0gbmV3IFJlc291cmNlQnVuZGxlS2V5TGlzdChhcnJheSk7CiAKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CiAJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJCX0KIAogCQkJCWZpbmFsIFJlc291cmNlQnVuZGxlS2V5TGlzdCBlbnRyeUxpc3QyID0gZW50cnlMaXN0OwogCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKQEAgLTk2OCw3ICsxMDM3LDggQEAKIAl9CiAKIAkvKioKLQkgKiBAcGFyYW0gY29sdW1uQ29uZmlncyBhbiBhcnJheSBjb250YWluaW5nIDxjb2RlPktFWTwvY29kZT4gYW5kIHtAbGluayBMb2NhbGV9IHZhbHVlcyAKKwkgKiBAcGFyYW0gY29sdW1uQ29uZmlncworCSAqICAgICAgICAgICAgYW4gYXJyYXkgY29udGFpbmluZyA8Y29kZT5LRVk8L2NvZGU+IGFuZCB7QGxpbmsgTG9jYWxlfSB2YWx1ZXMKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRDb2x1bW5zKE9iamVjdFtdIGNvbHVtbkNvbmZpZ3MpIHsKIAkJdGhpcy5jb2x1bW5Db25maWdzID0gY29sdW1uQ29uZmlnczsKQEAgLTk5MiwxMCArMTA2MiwxMiBAQAogCiAJCS8vIENyZWF0ZSBjb2x1bW5zCiAJCWZvciAoT2JqZWN0IGNvbmZpZyA6IGNvbHVtbkNvbmZpZ3MpIHsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkKKwkJCWlmIChjb25maWcgPT0gbnVsbCkgewogCQkJCWNvbnRpbnVlOworCQkJfQogCi0JCQlmaW5hbCBUYWJsZVZpZXdlckNvbHVtbiB2aWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4odGFibGVWaWV3ZXIsIFNXVC5OT05FKTsKKwkJCWZpbmFsIFRhYmxlVmlld2VyQ29sdW1uIHZpZXdlckNvbHVtbiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbigKKwkJCSAgICAgICAgdGFibGVWaWV3ZXIsIFNXVC5OT05FKTsKIAkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IHZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKIAkJCWlmIChjb25maWcgPT0gS0VZKSB7CiAJCQkJY29sdW1uLnNldFRleHQoIktleSIpOwpAQCAtMTAwNSwxNCArMTA3NywxNiBAQAogCQkJCQljb2x1bW4uc2V0VGV4dCgiRGVmYXVsdCBCdW5kbGUiKTsKIAkJCQl9IGVsc2UgewogCQkJCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBsb2NhbGUuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCQkJaWYgKGRpc3BsYXlOYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKGRpc3BsYXlOYW1lLmVxdWFscygiIikpIHsKIAkJCQkJCWRpc3BsYXlOYW1lID0gbG9jYWxlLnRvU3RyaW5nKCk7CisJCQkJCX0KIAkJCQkJY29sdW1uLnNldFRleHQoZGlzcGxheU5hbWUpOwogCQkJCQlsb2NhbGVzVG9VbmxvYWQucmVtb3ZlKGxvY2FsZSk7CiAJCQkJfQogCQkJfQogCi0JCQl2aWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgTG9jYWxpemF0aW9uTGFiZWxQcm92aWRlcihjb25maWcpKTsKKwkJCXZpZXdlckNvbHVtbgorCQkJICAgICAgICAuc2V0TGFiZWxQcm92aWRlcihuZXcgTG9jYWxpemF0aW9uTGFiZWxQcm92aWRlcihjb25maWcpKTsKIAkJCXRhYmxlQ29sdW1uTGF5b3V0LnNldENvbHVtbkRhdGEoY29sdW1uLCBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMykpOwogCQkJY29sdW1ucy5hZGQoY29sdW1uKTsKIAkJCWNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKQEAgLTEwNDAsOCArMTExNCw5IEBACiAJCQlzb3J0T3JkZXIgPSBLRVk7IC8vIGZhbGwgYmFjayB0byBkZWZhdWx0IHNvcnQgb3JkZXIKIAkJfQogCQlpbnQgaW5kZXggPSBjb25maWdzLmluZGV4T2Yoc29ydE9yZGVyKTsKLQkJaWYgKGluZGV4ICE9IC0xKQorCQlpZiAoaW5kZXggIT0gLTEpIHsKIAkJCXRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1ucy5nZXQoaW5kZXgpKTsKKwkJfQogCiAJCXJlZnJlc2goKTsKIAl9CkBAIC0xMDUxLDE4ICsxMTI2LDIyIEBACiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikgQ2xhc3MgYWRhcHRlcikgewogCQlpZiAoSVNob3dJblNvdXJjZS5jbGFzcyA9PSBhZGFwdGVyKSB7CiAJCQlyZXR1cm4gbmV3IElTaG93SW5Tb3VyY2UoKSB7CiAJCQkJcHVibGljIFNob3dJbkNvbnRleHQgZ2V0U2hvd0luQ29udGV4dCgpIHsKIAkJCQkJUmVzb3VyY2VCdW5kbGVLZXkgZW50cnkgPSBnZXRTZWxlY3RlZEVudHJ5KCk7Ci0JCQkJCWlmIChlbnRyeSA9PSBudWxsKQorCQkJCQlpZiAoZW50cnkgPT0gbnVsbCkgewogCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGVudHJ5LmdldFBhcmVudCgpLmdldEJ1bmRsZShuZXcgTG9jYWxlKCIiKSk7Ci0JCQkJCWlmIChidW5kbGUgPT0gbnVsbCkKKwkJCQkJfQorCQkJCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBlbnRyeS5nZXRQYXJlbnQoKS5nZXRCdW5kbGUoCisJCQkJCSAgICAgICAgbmV3IExvY2FsZSgiIikpOworCQkJCQlpZiAoYnVuZGxlID09IG51bGwpIHsKIAkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CiAJCQkJCU9iamVjdCByZXNvdXJjZSA9IGJ1bmRsZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkJcmV0dXJuIG5ldyBTaG93SW5Db250ZXh0KHJlc291cmNlLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXNvdXJjZSkpOworCQkJCQlyZXR1cm4gbmV3IFNob3dJbkNvbnRleHQocmVzb3VyY2UsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAorCQkJCQkgICAgICAgIHJlc291cmNlKSk7CiAJCQkJfQogCQkJfTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL21vZGVsL1Jlc291cmNlQnVuZGxlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGUuamF2YQppbmRleCA2M2Y4NzE5Li5jNmI4YTQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGUuamF2YQpAQCAtMSwxMiArMSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTe+/vWNrZSBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICAqCiAgKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU3RlZmFuIE38Y2tlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlZmFuIE3vv71ja2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLm1vZGVsOwogCkBAIC0xNSw5ICsxNSw5IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL21vZGVsL1Jlc291cmNlQnVuZGxlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9tb2RlbC9SZXNvdXJjZUJ1bmRsZU1vZGVsLmphdmEKaW5kZXggNTAwY2U2YS4uZTJmODEwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL21vZGVsL1Jlc291cmNlQnVuZGxlTW9kZWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVNb2RlbC5qYXZhCkBAIC0xLDEyICsxLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBN/GNrZSBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBN77+9Y2tlIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogICoKICAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTdGVmYW4gTfxja2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVmYW4gTe+/vWNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkubW9kZWw7CiAKQEAgLTMyLDQ4OSArMzIsNTQxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLklGcmFnbWVudE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5JUGx1Z2luTW9kZWxCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5QbHVnaW5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247CiAKIC8qKgotICogQSA8Y29kZT5SZXNvdXJjZUJ1bmRsZU1vZGVsPC9jb2RlPiBpcyB0aGUgaG9zdCBmb3IgYWxsIHtAbGluayBSZXNvdXJjZUJ1bmRsZUZhbWlseX0gZWxlbWVudHMuIAorICogQSA8Y29kZT5SZXNvdXJjZUJ1bmRsZU1vZGVsPC9jb2RlPiBpcyB0aGUgaG9zdCBmb3IgYWxsCisgKiB7QGxpbmsgUmVzb3VyY2VCdW5kbGVGYW1pbHl9IGVsZW1lbnRzLgogICovCiBwdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVNb2RlbCBleHRlbmRzIFJlc291cmNlQnVuZGxlRWxlbWVudCB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19TVUZGSVggPSAiLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfU1VGRklYID0gIi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTkFUVVJFID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTkFUVVJFID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiOyAvLyROT04tTkxTLTEkCiAKLQlwcml2YXRlIEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUZhbWlseT4gYnVuZGxlRmFtaWxpZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlRmFtaWx5PigpOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlRmFtaWx5PiBidW5kbGVGYW1pbGllcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VCdW5kbGVGYW1pbHk+KCk7CiAKLQkvKioKLQkgKiBUaGUgbG9jYWxlcyBmb3Igd2hpY2ggYWxsIGJ1bmRsZXMgaGF2ZSBiZWVuIGxvYWRlZC4KLQkgKi8KLQkvLyBUT0RPIFBlcmhhcHMgd2Ugc2hvdWxkIGFkZCByZWZlcmVuY2UgY291bnRpbmcgdG8gcHJldmVudCB1bmV4cGVjdGVkIHVubG9hZGluZyBvZiBidW5kbGVzIAotCXByaXZhdGUgSGFzaFNldDxMb2NhbGU+IGxvYWRlZExvY2FsZXMgPSBuZXcgSGFzaFNldDxMb2NhbGU+KCk7CisgICAgLyoqCisgICAgICogVGhlIGxvY2FsZXMgZm9yIHdoaWNoIGFsbCBidW5kbGVzIGhhdmUgYmVlbiBsb2FkZWQuCisgICAgICovCisgICAgLy8gVE9ETyBQZXJoYXBzIHdlIHNob3VsZCBhZGQgcmVmZXJlbmNlIGNvdW50aW5nIHRvIHByZXZlbnQgdW5leHBlY3RlZAorICAgIC8vIHVubG9hZGluZyBvZiBidW5kbGVzCisgICAgcHJpdmF0ZSBIYXNoU2V0PExvY2FsZT4gbG9hZGVkTG9jYWxlcyA9IG5ldyBIYXNoU2V0PExvY2FsZT4oKTsKIAotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZU1vZGVsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBlcihudWxsKTsKKyAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGVNb2RlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwlzdXBlcihudWxsKTsKKwl0cnkgeworCSAgICBwb3B1bGF0ZUZyb21Xb3Jrc3BhY2UobW9uaXRvcik7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJICAgIE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZyhlKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgcmVzb3VyY2UgYnVuZGxlIGZhbWlsaWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1vZGVsLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYWxsIHJlc291cmNlIGJ1bmRsZSBmYW1pbGllcyBjb250YWluZWQgaW4gdGhpcyBtb2RlbAorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZUZhbWlseVtdIGdldEZhbWlsaWVzKCkgeworCXJldHVybiBidW5kbGVGYW1pbGllcy50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZUZhbWlseVtidW5kbGVGYW1pbGllcworCQkuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIFJlc291cmNlQnVuZGxlRmFtaWx5W10gZ2V0RmFtaWxpZXNGb3JQbHVnaW5JZChTdHJpbmcgcGx1Z2luSWQpIHsKKwlBcnJheUxpc3Q8UmVzb3VyY2VCdW5kbGVGYW1pbHk+IGZvdW5kID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUZhbWlseT4oKTsKKwlmb3IgKFJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA6IGJ1bmRsZUZhbWlsaWVzKSB7CisJICAgIGlmIChmYW1pbHkuZ2V0UGx1Z2luSWQoKS5lcXVhbHMocGx1Z2luSWQpKSB7CisJCWZvdW5kLmFkZChmYW1pbHkpOworCSAgICB9CisJfQorCXJldHVybiBmb3VuZC50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZUZhbWlseVtmb3VuZC5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGVGYW1pbHlbXSBnZXRGYW1pbGllc0ZvclByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgeworCUFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUZhbWlseT4gZm91bmQgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlRmFtaWx5PigpOworCWZvciAoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5IDogYnVuZGxlRmFtaWxpZXMpIHsKKwkgICAgaWYgKGZhbWlseS5nZXRQcm9qZWN0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKKwkJZm91bmQuYWRkKGZhbWlseSk7CisJICAgIH0KKwl9CisJcmV0dXJuIGZvdW5kLnRvQXJyYXkobmV3IFJlc291cmNlQnVuZGxlRmFtaWx5W2ZvdW5kLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZUZhbWlseVtdIGdldEZhbWlsaWVzRm9yUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7CisJcmV0dXJuIGdldEZhbWlsaWVzRm9yUHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGN1cnJlbnRseSBrbm93biBidW5kbGUga2V5cy4gVGhpcyBhbHdheXMgaW5jbHVkZXMKKyAgICAgKiB0aGUga2V5cyBmcm9tIHRoZSBkZWZhdWx0IGJ1bmRsZXMgYW5kIG1heSBpbmNsdWRlIHNvbWUgYWRkaXRpb25hbCBrZXlzCisgICAgICogZnJvbSBidW5kbGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzb21ldGltZSBhbmQgdGhhdCBjb250YWluIGtleXMgbm90CisgICAgICogZm91bmQgaW4gYSBidW5kbGUncyBkZWZhdWx0IGJ1bmRsZS4gV2hlbiBhIGJ1bmRsZSBpcyB1bmxvYWRlZCwgdGhlc2UKKyAgICAgKiBhZGRpdGlvbmFsIGtleXMgd2lsbCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBidW5kbGVzIGtleXMKKyAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGVLZXlbXSBnZXRBbGxLZXlzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCUxvY2FsZSByb290ID0gbmV3IExvY2FsZSgiIiwgIiIsICIiKTsKKworCS8vIEVuc3VyZSBkZWZhdWx0IGJ1bmRsZSBpcyBsb2FkZWQgYW5kIGNvdW50IGtleXMKKwlpbnQgc2l6ZSA9IDA7CisJZm9yIChSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgOiBidW5kbGVGYW1pbGllcykgeworCSAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBmYW1pbHkuZ2V0QnVuZGxlKHJvb3QpOworCSAgICBpZiAoYnVuZGxlICE9IG51bGwpCisJCWJ1bmRsZS5sb2FkKCk7CisJICAgIHNpemUgKz0gZmFtaWx5LmdldEtleUNvdW50KCk7CisJfQorCisJQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PiBhbGxLZXlzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUtleT4oCisJCXNpemUpOworCWZvciAoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5IDogYnVuZGxlRmFtaWxpZXMpIHsKKwkgICAgUmVzb3VyY2VCdW5kbGVLZXlbXSBrZXlzID0gZmFtaWx5LmdldEtleXMoKTsKKwkgICAgZm9yIChSZXNvdXJjZUJ1bmRsZUtleSBrZXkgOiBrZXlzKSB7CisJCWFsbEtleXMuYWRkKGtleSk7CisJICAgIH0KKwl9CisKKwlyZXR1cm4gYWxsS2V5cy50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZUtleVthbGxLZXlzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGFsbCB0aGUgYnVuZGxlcyBmb3IgdGhlIGdpdmVuIGxvY2FsZSBpbnRvIG1lbW9yeS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlIG9mIHRoZSBidW5kbGVzIHRvIGxvYWQKKyAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkQnVuZGxlcyhMb2NhbGUgbG9jYWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJUmVzb3VyY2VCdW5kbGVGYW1pbHlbXSBmYW1pbGllcyA9IGdldEZhbWlsaWVzKCk7CisJZm9yIChSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgOiBmYW1pbGllcykgeworCSAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBmYW1pbHkuZ2V0QnVuZGxlKGxvY2FsZSk7CisJICAgIGlmIChidW5kbGUgIT0gbnVsbCkKKwkJYnVuZGxlLmxvYWQoKTsKKwl9CisJbG9hZGVkTG9jYWxlcy5hZGQobG9jYWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmxvYWRzIGFsbCB0aGUgYnVuZGxlcyBmb3IgdGhlIGdpdmVuIGxvY2FsZSBmcm9tIHRoaXMgbW9kZWwuIFRoZSBkZWZhdWx0CisgICAgICogYnVuZGxlIGNhbm5vdCBiZSB1bmxvYWRlZC4gU3VjaCBhIHJlcXVlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUgb2YgdGhlIGJ1bmRsZXMgdG8gdW5sb2FkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2FkQnVuZGxlcyhMb2NhbGUgbG9jYWxlKSB7CisJaWYgKCIiLmVxdWFscyhsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSkpCisJICAgIHJldHVybjsgLy8gbmV2ZXIgdW5sb2FkIHRoZSBkZWZhdWx0IGJ1bmRsZXMKKworCVJlc291cmNlQnVuZGxlRmFtaWx5W10gZmFtaWxpZXMgPSBnZXRGYW1pbGllcygpOworCWZvciAoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5IDogZmFtaWxpZXMpIHsKKwkgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZmFtaWx5LmdldEJ1bmRsZShsb2NhbGUpOworCSAgICBpZiAoYnVuZGxlICE9IG51bGwpCisJCWJ1bmRsZS51bmxvYWQoKTsKKwl9CisJbG9hZGVkTG9jYWxlcy5yZW1vdmUobG9jYWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbW9uaXRvcgorICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUZyb21Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHdvcmtzcGFjZS5nZXRSb290KCk7CisJSVByb2plY3RbXSBwcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKKwlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgeworCSAgICB0cnkgeworCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpCisJCSAgICBjb250aW51ZTsKKworCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0CisJCQkuZ2V0TmF0dXJlKEpBVkFfTkFUVVJFKTsKKwkJU3RyaW5nIHBsdWdpbklkID0gbnVsbDsKKwogCQl0cnkgewotCQkJcG9wdWxhdGVGcm9tV29ya3NwYWNlKG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KKwkJICAgIENsYXNzIElGcmFnbWVudE1vZGVsID0gQ2xhc3MKKwkJCSAgICAuZm9yTmFtZSgib3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLklGcmFnbWVudE1vZGVsIik7CisJCSAgICBDbGFzcyBJUGx1Z2luTW9kZWxCYXNlID0gQ2xhc3MKKwkJCSAgICAuZm9yTmFtZSgib3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLklQbHVnaW5Nb2RlbEJhc2UiKTsKKwkJICAgIENsYXNzIFBsdWdpblJlZ2lzdHJ5ID0gQ2xhc3MKKwkJCSAgICAuZm9yTmFtZSgib3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLlBsdWdpblJlZ2lzdHJ5Iik7CisJCSAgICBDbGFzcyBJUGx1Z2luQmFzZSA9IENsYXNzCisJCQkgICAgLmZvck5hbWUoIm9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5JUGx1Z2luQmFzZSIpOworCQkgICAgQ2xhc3MgUGx1Z2luRnJhZ21lbnRNb2RlbCA9IENsYXNzCisJCQkgICAgLmZvck5hbWUoIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5tb2RlbC5QbHVnaW5GcmFnbWVudE1vZGVsIik7CiAKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCByZXNvdXJjZSBidW5kbGUgZmFtaWxpZXMgY29udGFpbmVkIGluIHRoaXMgbW9kZWwuCi0JICogCi0JICogQHJldHVybiBhbGwgcmVzb3VyY2UgYnVuZGxlIGZhbWlsaWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1vZGVsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlRmFtaWx5W10gZ2V0RmFtaWxpZXMoKSB7Ci0JCXJldHVybiBidW5kbGVGYW1pbGllcy50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZUZhbWlseVtidW5kbGVGYW1pbGllcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGVGYW1pbHlbXSBnZXRGYW1pbGllc0ZvclBsdWdpbklkKFN0cmluZyBwbHVnaW5JZCkgewotCQlBcnJheUxpc3Q8UmVzb3VyY2VCdW5kbGVGYW1pbHk+IGZvdW5kID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUZhbWlseT4oKTsKLQkJZm9yIChSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgOiBidW5kbGVGYW1pbGllcykgewotCQkJaWYgKGZhbWlseS5nZXRQbHVnaW5JZCgpLmVxdWFscyhwbHVnaW5JZCkpIHsKLQkJCQlmb3VuZC5hZGQoZmFtaWx5KTsKKwkJICAgIC8vIFBsdWdpbiBhbmQgZnJhZ21lbnQgcHJvamVjdHMKKwkJICAgIENsYXNzIHBsdWdpbk1vZGVsID0gKENsYXNzKSBQbHVnaW5SZWdpc3RyeS5nZXRNZXRob2QoCisJCQkgICAgImZpbmRNb2RlbCIsIElQcm9qZWN0LmNsYXNzKS5pbnZva2UobnVsbCwgcHJvamVjdCk7CisJCSAgICBpZiAocGx1Z2luTW9kZWwgIT0gbnVsbCkgeworCQkJLy8gR2V0IHBsdWdpbiBpZAorCQkJQnVuZGxlRGVzY3JpcHRpb24gYmQgPSAoQnVuZGxlRGVzY3JpcHRpb24pIElQbHVnaW5Nb2RlbEJhc2UKKwkJCQkuZ2V0TWV0aG9kKCJnZXRCdW5kbGVEZXNjcmlwdGlvbiIpLmludm9rZSgKKwkJCQkJcGx1Z2luTW9kZWwpOworCQkJcGx1Z2luSWQgPSBiZC5nZXROYW1lKCk7CisJCQkvLyBPU0dpIGJ1bmRsZSBuYW1lCisJCQlpZiAocGx1Z2luSWQgPT0gbnVsbCkgeworCQkJICAgIE9iamVjdCBwbHVnaW5CYXNlID0gSVBsdWdpbk1vZGVsQmFzZS5nZXRNZXRob2QoCisJCQkJICAgICJnZXRQbHVnaW5CYXNlIikuaW52b2tlKHBsdWdpbk1vZGVsKTsKKwkJCSAgICBwbHVnaW5JZCA9IChTdHJpbmcpIElQbHVnaW5CYXNlLmdldE1ldGhvZCgiZ2V0SWQiKQorCQkJCSAgICAuaW52b2tlKHBsdWdpbkJhc2UpOyAvLyBub24tT1NHaQorCQkJICAgIC8vIHBsdWctaW4gaWQKIAkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmQudG9BcnJheShuZXcgUmVzb3VyY2VCdW5kbGVGYW1pbHlbZm91bmQuc2l6ZSgpXSk7Ci0JfQogCi0JcHVibGljIFJlc291cmNlQnVuZGxlRmFtaWx5W10gZ2V0RmFtaWxpZXNGb3JQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlRmFtaWx5PiBmb3VuZCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VCdW5kbGVGYW1pbHk+KCk7Ci0JCWZvciAoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5IDogYnVuZGxlRmFtaWxpZXMpIHsKLQkJCWlmIChmYW1pbHkuZ2V0UHJvamVjdE5hbWUoKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7Ci0JCQkJZm91bmQuYWRkKGZhbWlseSk7CisJCQlib29sZWFuIGlzRnJhZ21lbnQgPSBJRnJhZ21lbnRNb2RlbAorCQkJCS5pc0luc3RhbmNlKHBsdWdpbk1vZGVsKTsKKwkJCWlmIChpc0ZyYWdtZW50KSB7CisJCQkgICAgT2JqZWN0IHBmbSA9IElGcmFnbWVudE1vZGVsCisJCQkJICAgIC5nZXRNZXRob2QoImdldEZyYWdtZW50Iik7CisJCQkgICAgcGx1Z2luSWQgPSAoU3RyaW5nKSBQbHVnaW5GcmFnbWVudE1vZGVsLmdldE1ldGhvZCgKKwkJCQkgICAgImdldFBsdWdpbklkIikuaW52b2tlKHBmbSk7CiAJCQl9Ci0JCX0KLQkJcmV0dXJuIGZvdW5kLnRvQXJyYXkobmV3IFJlc291cmNlQnVuZGxlRmFtaWx5W2ZvdW5kLnNpemUoKV0pOwotCX0KIAotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZUZhbWlseVtdIGdldEZhbWlsaWVzRm9yUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRGYW1pbGllc0ZvclByb2plY3ROYW1lKHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9CisJCQkvLyBMb29rIGZvciBhZGRpdGlvbmFsICdubCcgcmVzb3VyY2VzCisJCQlJRm9sZGVyIG5sID0gcHJvamVjdC5nZXRGb2xkZXIoIm5sIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChpc0ZyYWdtZW50ICYmIG5sLmV4aXN0cygpKSB7CisJCQkgICAgSVJlc291cmNlW10gbWVtYmVycyA9IG5sLm1lbWJlcnMoKTsKKwkJCSAgICBmb3IgKElSZXNvdXJjZSBtZW1iZXIgOiBtZW1iZXJzKSB7CisJCQkJaWYgKG1lbWJlciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQkgICAgSUZvbGRlciBsYW5nRm9sZGVyID0gKElGb2xkZXIpIG1lbWJlcjsKKwkJCQkgICAgU3RyaW5nIGxhbmd1YWdlID0gbGFuZ0ZvbGRlci5nZXROYW1lKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBjdXJyZW50bHkga25vd24gYnVuZGxlIGtleXMuIFRoaXMgYWx3YXlzIGluY2x1ZGVzCi0JICogdGhlIGtleXMgZnJvbSB0aGUgZGVmYXVsdCBidW5kbGVzIGFuZCBtYXkgaW5jbHVkZSBzb21lIGFkZGl0aW9uYWwga2V5cwotCSAqIGZyb20gYnVuZGxlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgc29tZXRpbWUgYW5kIHRoYXQgY29udGFpbiBrZXlzIG5vdCBmb3VuZCBpbgotCSAqIGEgYnVuZGxlJ3MgZGVmYXVsdCBidW5kbGUuIFdoZW4gYSBidW5kbGUgaXMgdW5sb2FkZWQsIHRoZXNlIGFkZGl0aW9uYWwga2V5cwotCSAqIHdpbGwgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwuCi0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgYnVuZGxlcyBrZXlzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZUtleVtdIGdldEFsbEtleXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxvY2FsZSByb290ID0gbmV3IExvY2FsZSgiIiwgIiIsICIiKTsKLQkJCi0JCS8vIEVuc3VyZSBkZWZhdWx0IGJ1bmRsZSBpcyBsb2FkZWQgYW5kIGNvdW50IGtleXMgIAotCQlpbnQgc2l6ZSA9IDA7Ci0JCWZvciAoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5IDogYnVuZGxlRmFtaWxpZXMpIHsKLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGZhbWlseS5nZXRCdW5kbGUocm9vdCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJYnVuZGxlLmxvYWQoKTsKLQkJCXNpemUgKz0gZmFtaWx5LmdldEtleUNvdW50KCk7Ci0JCX0KKwkJCQkgICAgLy8gQ29sbGVjdCBwcm9wZXJ0eSBmaWxlcworCQkJCSAgICBJRmlsZVtdIHByb3BlcnR5RmlsZXMgPSBjb2xsZWN0UHJvcGVydHlGaWxlcyhsYW5nRm9sZGVyKTsKKwkJCQkgICAgZm9yIChJRmlsZSBmaWxlIDogcHJvcGVydHlGaWxlcykgeworCQkJCQkvLyBDb21wdXRlIHBhdGggbmFtZQorCQkJCQlJUGF0aCBwYXRoID0gZmlsZQorCQkJCQkJLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwkJCQkJU3RyaW5nIGNvdW50cnkgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOworCQkJCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKKwkJCQkJaWYgKHNlZ21lbnRDb3VudCA+IDEpIHsKKwkJCQkJICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKLQkJQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PiBhbGxLZXlzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUtleT4oc2l6ZSk7Ci0JCWZvciAoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5IDogYnVuZGxlRmFtaWxpZXMpIHsKLQkJCVJlc291cmNlQnVuZGxlS2V5W10ga2V5cyA9IGZhbWlseS5nZXRLZXlzKCk7Ci0JCQlmb3IgKFJlc291cmNlQnVuZGxlS2V5IGtleSA6IGtleXMpIHsKLQkJCQlhbGxLZXlzLmFkZChrZXkpOworCQkJCQkgICAgLy8gU2VnbWVudCAwOiAnbmwnCisJCQkJCSAgICAvLyBTZWdtZW50IDE6IGxhbmd1YWdlIGNvZGUKKwkJCQkJICAgIC8vIFNlZ21lbnQgMjogKGNvdW50cnkgY29kZSkKKwkJCQkJICAgIGludCBiZWdpbiA9IDI7CisJCQkJCSAgICBpZiAoc2VnbWVudENvdW50ID4gMgorCQkJCQkJICAgICYmIGlzQ291bnRyeShwYXRoCisJCQkJCQkJICAgIC5zZWdtZW50KDIpKSkgeworCQkJCQkJYmVnaW4gPSAzOworCQkJCQkJY291bnRyeSA9IHBhdGguc2VnbWVudCgyKTsKKwkJCQkJICAgIH0KKworCQkJCQkgICAgZm9yIChpbnQgaSA9IGJlZ2luOyBpIDwgc2VnbWVudENvdW50IC0gMTsgaSsrKSB7CisJCQkJCQlpZiAoaSA+IGJlZ2luKQorCQkJCQkJICAgIGJ1aWxkZXIuYXBwZW5kKCcuJyk7CisJCQkJCQlidWlsZGVyLmFwcGVuZChwYXRoLnNlZ21lbnQoaSkpOworCQkJCQkgICAgfQorCQkJCQkgICAgcGFja2FnZU5hbWUgPSBidWlsZGVyLnRvU3RyaW5nKCk7CisJCQkJCX0KKworCQkJCQlTdHJpbmcgYmFzZU5hbWUgPSBnZXRCYXNlTmFtZShmaWxlCisJCQkJCQkuZ2V0TmFtZSgpKTsKKworCQkJCQlSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgPSBnZXRPckNyZWF0ZUZhbWlseSgKKwkJCQkJCXByb2plY3QuZ2V0TmFtZSgpLCBwbHVnaW5JZCwKKwkJCQkJCXBhY2thZ2VOYW1lLCBiYXNlTmFtZSk7CisJCQkJCWFkZEJ1bmRsZShmYW1pbHksCisJCQkJCQlnZXRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpLAorCQkJCQkJZmlsZSk7CisJCQkJICAgIH0KKwkJCQl9CisJCQkgICAgfQogCQkJfQotCQl9CiAKLQkJcmV0dXJuIGFsbEtleXMudG9BcnJheShuZXcgUmVzb3VyY2VCdW5kbGVLZXlbYWxsS2V5cy5zaXplKCldKTsKLQl9CisJCQkvLyBDb2xsZWN0IHByb3BlcnR5IGZpbGVzCisJCQlpZiAoaXNGcmFnbWVudCB8fCBqYXZhUHJvamVjdCA9PSBudWxsKSB7CisJCQkgICAgSUZpbGVbXSBwcm9wZXJ0eUZpbGVzID0gY29sbGVjdFByb3BlcnR5RmlsZXMocHJvamVjdCk7CisJCQkgICAgZm9yIChJRmlsZSBmaWxlIDogcHJvcGVydHlGaWxlcykgeworCQkJCUlQYXRoIHBhdGggPSBmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwkJCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKIAotCS8qKgotCSAqIExvYWRzIGFsbCB0aGUgYnVuZGxlcyBmb3IgdGhlIGdpdmVuIGxvY2FsZSBpbnRvIG1lbW9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgb2YgdGhlIGJ1bmRsZXMgdG8gbG9hZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkQnVuZGxlcyhMb2NhbGUgbG9jYWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlQnVuZGxlRmFtaWx5W10gZmFtaWxpZXMgPSBnZXRGYW1pbGllcygpOwotCQlmb3IgKFJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA6IGZhbWlsaWVzKSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBmYW1pbHkuZ2V0QnVuZGxlKGxvY2FsZSk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJYnVuZGxlLmxvYWQoKTsKLQkJfQotCQlsb2FkZWRMb2NhbGVzLmFkZChsb2NhbGUpOwotCX0KKwkJCQlpZiAoc2VnbWVudENvdW50ID4gMAorCQkJCQkmJiBwYXRoLnNlZ21lbnQoMCkuZXF1YWxzKCJubCIpKSAvLyROT04tTkxTLTEkCisJCQkJICAgIGNvbnRpbnVlOyAvLyAnbmwnIHJlc291cmNlIGhhdmUgYmVlbgorCQkJCQkgICAgICAvLyBwcm9jZXNzZWQKKwkJCQkvLyBhYm92ZQogCi0JLyoqCi0JICogVW5sb2FkcyBhbGwgdGhlIGJ1bmRsZXMgZm9yIHRoZSBnaXZlbiBsb2NhbGUgZnJvbSB0aGlzIG1vZGVsLiBUaGUgZGVmYXVsdAotCSAqIGJ1bmRsZSBjYW5ub3QgYmUgdW5sb2FkZWQuIFN1Y2ggYSByZXF1ZXN0IHdpbGwgYmUgaWdub3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgb2YgdGhlIGJ1bmRsZXMgdG8gdW5sb2FkCi0JICovCi0JcHVibGljIHZvaWQgdW5sb2FkQnVuZGxlcyhMb2NhbGUgbG9jYWxlKSB7Ci0JCWlmICgiIi5lcXVhbHMobG9jYWxlLmdldExhbmd1YWdlKCkpKQotCQkJcmV0dXJuOyAvLyBuZXZlciB1bmxvYWQgdGhlIGRlZmF1bHQgYnVuZGxlcwotCi0JCVJlc291cmNlQnVuZGxlRmFtaWx5W10gZmFtaWxpZXMgPSBnZXRGYW1pbGllcygpOwotCQlmb3IgKFJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA6IGZhbWlsaWVzKSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBmYW1pbHkuZ2V0QnVuZGxlKGxvY2FsZSk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJYnVuZGxlLnVubG9hZCgpOwotCQl9Ci0JCWxvYWRlZExvY2FsZXMucmVtb3ZlKGxvY2FsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRnJvbVdvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgewotCQkJdHJ5IHsKLQkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdC5nZXROYXR1cmUoSkFWQV9OQVRVUkUpOwotCi0JCQkJLy8gUGx1Z2luIGFuZCBmcmFnbWVudCBwcm9qZWN0cwotCQkJCUlQbHVnaW5Nb2RlbEJhc2UgcGx1Z2luTW9kZWwgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwocHJvamVjdCk7Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gbnVsbDsKLQkJCQlpZiAocGx1Z2luTW9kZWwgIT0gbnVsbCkgewotCQkJCQkvLyBHZXQgcGx1Z2luIGlkCi0JCQkJCXBsdWdpbklkID0gcGx1Z2luTW9kZWwuZ2V0QnVuZGxlRGVzY3JpcHRpb24oKS5nZXROYW1lKCk7IC8vIE9TR2kgYnVuZGxlIG5hbWUKLQkJCQkJaWYgKHBsdWdpbklkID09IG51bGwpIHsKLQkJCQkJCXBsdWdpbklkID0gcGx1Z2luTW9kZWwuZ2V0UGx1Z2luQmFzZSgpLmdldElkKCk7IC8vIG5vbi1PU0dpIHBsdWctaW4gaWQKLQkJCQkJfQotCQkJCQlib29sZWFuIGlzRnJhZ21lbnQgPSBwbHVnaW5Nb2RlbCBpbnN0YW5jZW9mIElGcmFnbWVudE1vZGVsOwotCQkJCQlpZiAoaXNGcmFnbWVudCkgewotCQkJCQkJSUZyYWdtZW50TW9kZWwgZnJhZ21lbnRNb2RlbCA9IChJRnJhZ21lbnRNb2RlbCkgcGx1Z2luTW9kZWw7Ci0JCQkJCQlwbHVnaW5JZCA9IGZyYWdtZW50TW9kZWwuZ2V0RnJhZ21lbnQoKS5nZXRQbHVnaW5JZCgpOwotCQkJCQl9Ci0KLQkJCQkJLy8gTG9vayBmb3IgYWRkaXRpb25hbCAnbmwnIHJlc291cmNlcwotCQkJCQlJRm9sZGVyIG5sID0gcHJvamVjdC5nZXRGb2xkZXIoIm5sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGlzRnJhZ21lbnQgJiYgbmwuZXhpc3RzKCkpIHsKLQkJCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBubC5tZW1iZXJzKCk7Ci0JCQkJCQlmb3IgKElSZXNvdXJjZSBtZW1iZXIgOiBtZW1iZXJzKSB7Ci0JCQkJCQkJaWYgKG1lbWJlciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJCQkJSUZvbGRlciBsYW5nRm9sZGVyID0gKElGb2xkZXIpIG1lbWJlcjsKLQkJCQkJCQkJU3RyaW5nIGxhbmd1YWdlID0gbGFuZ0ZvbGRlci5nZXROYW1lKCk7Ci0KLQkJCQkJCQkJLy8gQ29sbGVjdCBwcm9wZXJ0eSBmaWxlcwotCQkJCQkJCQlJRmlsZVtdIHByb3BlcnR5RmlsZXMgPSBjb2xsZWN0UHJvcGVydHlGaWxlcyhsYW5nRm9sZGVyKTsKLQkJCQkJCQkJZm9yIChJRmlsZSBmaWxlIDogcHJvcGVydHlGaWxlcykgewotCQkJCQkJCQkJLy8gQ29tcHV0ZSBwYXRoIG5hbWUKLQkJCQkJCQkJCUlQYXRoIHBhdGggPSBmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQkJCQkJCVN0cmluZyBjb3VudHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0JCQkJCQkJCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAxKSB7Ci0JCQkJCQkJCQkJU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotCQkJCQkJCQkJCS8vIFNlZ21lbnQgMDogJ25sJwotCQkJCQkJCQkJCS8vIFNlZ21lbnQgMTogbGFuZ3VhZ2UgY29kZQotCQkJCQkJCQkJCS8vIFNlZ21lbnQgMjogKGNvdW50cnkgY29kZSkKLQkJCQkJCQkJCQlpbnQgYmVnaW4gPSAyOwotCQkJCQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAyICYmIGlzQ291bnRyeShwYXRoLnNlZ21lbnQoMikpKSB7Ci0JCQkJCQkJCQkJCWJlZ2luID0gMzsKLQkJCQkJCQkJCQkJY291bnRyeSA9IHBhdGguc2VnbWVudCgyKTsKLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQlmb3IgKGludCBpID0gYmVnaW47IGkgPCBzZWdtZW50Q291bnQgLSAxOyBpKyspIHsKLQkJCQkJCQkJCQkJaWYgKGkgPiBiZWdpbikKLQkJCQkJCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKCcuJyk7Ci0JCQkJCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKHBhdGguc2VnbWVudChpKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXBhY2thZ2VOYW1lID0gYnVpbGRlci50b1N0cmluZygpOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQlTdHJpbmcgYmFzZU5hbWUgPSBnZXRCYXNlTmFtZShmaWxlLmdldE5hbWUoKSk7Ci0KLQkJCQkJCQkJCVJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA9IGdldE9yQ3JlYXRlRmFtaWx5KAotCQkJCQkJCQkJCQlwcm9qZWN0LmdldE5hbWUoKSwKLQkJCQkJCQkJCQkJcGx1Z2luSWQsCi0JCQkJCQkJCQkJCXBhY2thZ2VOYW1lLAotCQkJCQkJCQkJCQliYXNlTmFtZSk7Ci0JCQkJCQkJCQlhZGRCdW5kbGUoZmFtaWx5LCBnZXRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpLCBmaWxlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIENvbGxlY3QgcHJvcGVydHkgZmlsZXMKLQkJCQkJaWYgKGlzRnJhZ21lbnQgfHwgamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJCQkJSUZpbGVbXSBwcm9wZXJ0eUZpbGVzID0gY29sbGVjdFByb3BlcnR5RmlsZXMocHJvamVjdCk7Ci0JCQkJCQlmb3IgKElGaWxlIGZpbGUgOiBwcm9wZXJ0eUZpbGVzKSB7Ci0JCQkJCQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCQkJCWludCBzZWdtZW50Q291bnQgPSBwYXRoLnNlZ21lbnRDb3VudCgpOwotCi0JCQkJCQkJaWYgKHNlZ21lbnRDb3VudCA+IDAgJiYgcGF0aC5zZWdtZW50KDApLmVxdWFscygibmwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQljb250aW51ZTsgLy8gJ25sJyByZXNvdXJjZSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFib3ZlCi0KLQkJCQkJCQkvLyBHdWVzcyBwYWNrYWdlIG5hbWUKLQkJCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOwotCQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAxKSB7Ci0JCQkJCQkJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudENvdW50IC0gMTsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoaSA+IDApCi0JCQkJCQkJCQkJYnVpbGRlci5hcHBlbmQoJy4nKTsKLQkJCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKHBhdGguc2VnbWVudChpKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcGFja2FnZU5hbWUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJU3RyaW5nIGJhc2VOYW1lID0gZ2V0QmFzZU5hbWUoZmlsZS5nZXROYW1lKCkpOwotCQkJCQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJCQlTdHJpbmcgY291bnRyeSA9IGdldENvdW50cnkoZmlsZS5nZXROYW1lKCkpOwotCi0JCQkJCQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gZ2V0T3JDcmVhdGVGYW1pbHkoCi0JCQkJCQkJCQlwcm9qZWN0LmdldE5hbWUoKSwKLQkJCQkJCQkJCXBsdWdpbklkLAotCQkJCQkJCQkJcGFja2FnZU5hbWUsCi0JCQkJCQkJCQliYXNlTmFtZSk7Ci0JCQkJCQkJYWRkQnVuZGxlKGZhbWlseSwgZ2V0TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSwgZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQorCQkJCS8vIEd1ZXNzIHBhY2thZ2UgbmFtZQorCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7CisJCQkJaWYgKHNlZ21lbnRDb3VudCA+IDEpIHsKKwkJCQkgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50Q291bnQgLSAxOyBpKyspIHsKKwkJCQkJaWYgKGkgPiAwKQorCQkJCQkgICAgYnVpbGRlci5hcHBlbmQoJy4nKTsKKwkJCQkJYnVpbGRlci5hcHBlbmQocGF0aC5zZWdtZW50KGkpKTsKKwkJCQkgICAgfQorCQkJCSAgICBwYWNrYWdlTmFtZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKIAkJCQl9CiAKLQkJCQkvLyBMb29rIGZvciByZXNvdXJjZSBidW5kbGVzIGluIEphdmEgcGFja2FnZXMgKG91dHB1dCBmb2xkZXJzLCBlLmcuICdiaW4nLCB3aWxsIGJlIGlnbm9yZWQpCi0JCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQkJCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGNsYXNzcGF0aEVudHJpZXMpIHsKLQkJCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCQkJSUZvbGRlciBmb2xkZXIgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKTsKLQkJCQkJCQlJRmlsZVtdIHByb3BlcnR5RmlsZXMgPSBjb2xsZWN0UHJvcGVydHlGaWxlcyhmb2xkZXIpOworCQkJCVN0cmluZyBiYXNlTmFtZSA9IGdldEJhc2VOYW1lKGZpbGUuZ2V0TmFtZSgpKTsKKwkJCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShmaWxlLmdldE5hbWUoKSk7CisJCQkJU3RyaW5nIGNvdW50cnkgPSBnZXRDb3VudHJ5KGZpbGUuZ2V0TmFtZSgpKTsKIAotCQkJCQkJCWZvciAoSUZpbGUgZmlsZSA6IHByb3BlcnR5RmlsZXMpIHsKLQkJCQkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQkJCQkJU3RyaW5nIGJhc2VOYW1lID0gZ2V0QmFzZU5hbWUobmFtZSk7Ci0JCQkJCQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG5hbWUpOwotCQkJCQkJCQlTdHJpbmcgY291bnRyeSA9IGdldENvdW50cnkobmFtZSk7Ci0JCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGYgPSBqYXZhUHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50KGZpbGUuZ2V0UGFyZW50KCkKLQkJCQkJCQkJCQkuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBmLmdldEVsZW1lbnROYW1lKCk7CisJCQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gZ2V0T3JDcmVhdGVGYW1pbHkoCisJCQkJCXByb2plY3QuZ2V0TmFtZSgpLCBwbHVnaW5JZCwKKwkJCQkJcGFja2FnZU5hbWUsIGJhc2VOYW1lKTsKKwkJCQlhZGRCdW5kbGUoZmFtaWx5LCBnZXRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpLAorCQkJCQlmaWxlKTsKKwkJCSAgICB9CisJCQl9CiAKLQkJCQkJCQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gZ2V0T3JDcmVhdGVGYW1pbHkoCi0JCQkJCQkJCQkJcHJvamVjdC5nZXROYW1lKCksCi0JCQkJCQkJCQkJcGx1Z2luSWQsCi0JCQkJCQkJCQkJcGFja2FnZU5hbWUsCi0JCQkJCQkJCQkJYmFzZU5hbWUpOworCQkgICAgfQorCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkgICAgLy8gTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKGUpOworCQl9CiAKLQkJCQkJCQkJYWRkQnVuZGxlKGZhbWlseSwgZ2V0TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSwgZmlsZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIGZpbmRQYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290cyhlbnRyeSk7Ci0JCQkJCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290IDogZmluZFBhY2thZ2VGcmFnbWVudFJvb3RzKSB7Ci0JCQkJCQkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRDaGlsZHJlbigpOwotCQkJCQkJCQlmb3IgKElKYXZhRWxlbWVudCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJCQkJCQlJUGFja2FnZUZyYWdtZW50IHBmID0gKElQYWNrYWdlRnJhZ21lbnQpIGNoaWxkOwotCQkJCQkJCQkJT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IHBmLmdldE5vbkphdmFSZXNvdXJjZXMoKTsKKwkJLy8gTG9vayBmb3IgcmVzb3VyY2UgYnVuZGxlcyBpbiBKYXZhIHBhY2thZ2VzIChvdXRwdXQgZm9sZGVycywKKwkJLy8gZS5nLiAnYmluJywgd2lsbCBiZSBpZ25vcmVkKQorCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgeworCQkgICAgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0CisJCQkgICAgLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBjbGFzc3BhdGhFbnRyaWVzKSB7CisJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKKwkJCSAgICBJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJICAgIElGb2xkZXIgZm9sZGVyID0gd29ya3NwYWNlLmdldFJvb3QoKQorCQkJCSAgICAuZ2V0Rm9sZGVyKHBhdGgpOworCQkJICAgIElGaWxlW10gcHJvcGVydHlGaWxlcyA9IGNvbGxlY3RQcm9wZXJ0eUZpbGVzKGZvbGRlcik7CiAKLQkJCQkJCQkJCWZvciAoT2JqZWN0IHJlc291cmNlIDogbm9uSmF2YVJlc291cmNlcykgewotCQkJCQkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElKYXJFbnRyeVJlc291cmNlKSB7Ci0JCQkJCQkJCQkJCUlKYXJFbnRyeVJlc291cmNlIGphckVudHJ5UmVzb3VyY2UgPSAoSUphckVudHJ5UmVzb3VyY2UpIHJlc291cmNlOwotCQkJCQkJCQkJCQlTdHJpbmcgbmFtZSA9IGphckVudHJ5UmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJCQkJCQkJCQlpZiAobmFtZS5lbmRzV2l0aChQUk9QRVJUSUVTX1NVRkZJWCkpIHsKLQkJCQkJCQkJCQkJCVN0cmluZyBiYXNlTmFtZSA9IGdldEJhc2VOYW1lKG5hbWUpOwotCQkJCQkJCQkJCQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobmFtZSk7Ci0JCQkJCQkJCQkJCQlTdHJpbmcgY291bnRyeSA9IGdldENvdW50cnkobmFtZSk7Ci0JCQkJCQkJCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwZi5nZXRFbGVtZW50TmFtZSgpOworCQkJICAgIGZvciAoSUZpbGUgZmlsZSA6IHByb3BlcnR5RmlsZXMpIHsKKwkJCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworCQkJCVN0cmluZyBiYXNlTmFtZSA9IGdldEJhc2VOYW1lKG5hbWUpOworCQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG5hbWUpOworCQkJCVN0cmluZyBjb3VudHJ5ID0gZ2V0Q291bnRyeShuYW1lKTsKKwkJCQlJUGFja2FnZUZyYWdtZW50IHBmID0gamF2YVByb2plY3QKKwkJCQkJLmZpbmRQYWNrYWdlRnJhZ21lbnQoZmlsZS5nZXRQYXJlbnQoKQorCQkJCQkJLmdldEZ1bGxQYXRoKCkpOworCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBmLmdldEVsZW1lbnROYW1lKCk7CiAKLQkJCQkJCQkJCQkJCVJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA9IGdldE9yQ3JlYXRlRmFtaWx5KAotCQkJCQkJCQkJCQkJCQlwcm9qZWN0LmdldE5hbWUoKSwKLQkJCQkJCQkJCQkJCQkJcGx1Z2luSWQsCi0JCQkJCQkJCQkJCQkJCXBhY2thZ2VOYW1lLAotCQkJCQkJCQkJCQkJCQliYXNlTmFtZSk7CisJCQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gZ2V0T3JDcmVhdGVGYW1pbHkoCisJCQkJCXByb2plY3QuZ2V0TmFtZSgpLCBwbHVnaW5JZCwKKwkJCQkJcGFja2FnZU5hbWUsIGJhc2VOYW1lKTsKIAotCQkJCQkJCQkJCQkJYWRkQnVuZGxlKAotCQkJCQkJCQkJCQkJCQlmYW1pbHksCi0JCQkJCQkJCQkJCQkJCWdldExvY2FsZShsYW5ndWFnZSwgY291bnRyeSksCi0JCQkJCQkJCQkJCQkJCWphckVudHJ5UmVzb3VyY2UpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CisJCQkJYWRkQnVuZGxlKGZhbWlseSwgZ2V0TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSwKKwkJCQkJZmlsZSk7CisJCQkgICAgfQorCQkJfSBlbHNlIGlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKKwkJCSAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGZpbmRQYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0CisJCQkJICAgIC5maW5kUGFja2FnZUZyYWdtZW50Um9vdHMoZW50cnkpOworCQkJICAgIGZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA6IGZpbmRQYWNrYWdlRnJhZ21lbnRSb290cykgeworCQkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gcGFja2FnZUZyYWdtZW50Um9vdAorCQkJCQkuZ2V0Q2hpbGRyZW4oKTsKKwkJCQlmb3IgKElKYXZhRWxlbWVudCBjaGlsZCA6IGNoaWxkcmVuKSB7CisJCQkJICAgIElQYWNrYWdlRnJhZ21lbnQgcGYgPSAoSVBhY2thZ2VGcmFnbWVudCkgY2hpbGQ7CisJCQkJICAgIE9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXMgPSBwZgorCQkJCQkgICAgLmdldE5vbkphdmFSZXNvdXJjZXMoKTsKIAotCQkJCQkvLyBDb2xsZWN0IG5vbi1KYXZhIHJlc291cmNlcyAKLQkJCQkJT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IGphdmFQcm9qZWN0LmdldE5vbkphdmFSZXNvdXJjZXMoKTsKLQkJCQkJQXJyYXlMaXN0PElGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCQkJCWZvciAoT2JqZWN0IHJlc291cmNlIDogbm9uSmF2YVJlc291cmNlcykgewotCQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQkJCWNvbGxlY3RQcm9wZXJ0eUZpbGVzKGNvbnRhaW5lciwgZmlsZXMpOwotCQkJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQkJCQlpZiAoaXNJZ25vcmVkRmlsZW5hbWUobmFtZSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCWlmIChuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfU1VGRklYKSkgewotCQkJCQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZvciAoSUZpbGUgZmlsZSA6IGZpbGVzKSB7Ci0KLQkJCQkJCS8vIENvbnZlcnQgcGF0aCB0byBwYWNrYWdlIG5hbWUgZm9ybWF0Ci0JCQkJCQlJUGF0aCBwYXRoID0gZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOwotCQkJCQkJaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJCQlpZiAoc2VnbWVudENvdW50ID4gMSkgewotCQkJCQkJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50Q291bnQgLSAxOyBpKyspIHsKLQkJCQkJCQkJaWYgKGkgPiAwKQotCQkJCQkJCQkJYnVpbGRlci5hcHBlbmQoJy4nKTsKLQkJCQkJCQkJYnVpbGRlci5hcHBlbmQocGF0aC5zZWdtZW50KGkpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcGFja2FnZU5hbWUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCVN0cmluZyBiYXNlTmFtZSA9IGdldEJhc2VOYW1lKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJCVN0cmluZyBjb3VudHJ5ID0gZ2V0Q291bnRyeShmaWxlLmdldE5hbWUoKSk7CisJCQkJICAgIGZvciAoT2JqZWN0IHJlc291cmNlIDogbm9uSmF2YVJlc291cmNlcykgeworCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJSmFyRW50cnlSZXNvdXJjZSkgeworCQkJCQkgICAgSUphckVudHJ5UmVzb3VyY2UgamFyRW50cnlSZXNvdXJjZSA9IChJSmFyRW50cnlSZXNvdXJjZSkgcmVzb3VyY2U7CisJCQkJCSAgICBTdHJpbmcgbmFtZSA9IGphckVudHJ5UmVzb3VyY2UKKwkJCQkJCSAgICAuZ2V0TmFtZSgpOworCQkJCQkgICAgaWYgKG5hbWUuZW5kc1dpdGgoUFJPUEVSVElFU19TVUZGSVgpKSB7CisJCQkJCQlTdHJpbmcgYmFzZU5hbWUgPSBnZXRCYXNlTmFtZShuYW1lKTsKKwkJCQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG5hbWUpOworCQkJCQkJU3RyaW5nIGNvdW50cnkgPSBnZXRDb3VudHJ5KG5hbWUpOworCQkJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGYKKwkJCQkJCQkuZ2V0RWxlbWVudE5hbWUoKTsKIAogCQkJCQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gZ2V0T3JDcmVhdGVGYW1pbHkoCi0JCQkJCQkJCXByb2plY3QuZ2V0TmFtZSgpLAotCQkJCQkJCQlwbHVnaW5JZCwKLQkJCQkJCQkJcGFja2FnZU5hbWUsCi0JCQkJCQkJCWJhc2VOYW1lKTsKLQkJCQkJCWFkZEJ1bmRsZShmYW1pbHksIGdldExvY2FsZShsYW5ndWFnZSwgY291bnRyeSksIGZpbGUpOworCQkJCQkJCXByb2plY3QuZ2V0TmFtZSgpLAorCQkJCQkJCXBsdWdpbklkLCBwYWNrYWdlTmFtZSwKKwkJCQkJCQliYXNlTmFtZSk7CisKKwkJCQkJCWFkZEJ1bmRsZSgKKwkJCQkJCQlmYW1pbHksCisJCQkJCQkJZ2V0TG9jYWxlKGxhbmd1YWdlLAorCQkJCQkJCQljb3VudHJ5KSwKKwkJCQkJCQlqYXJFbnRyeVJlc291cmNlKTsKKwkJCQkJICAgIH0KIAkJCQkJfQotCisJCQkJICAgIH0KIAkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZyhlKTsKKwkJCSAgICB9CiAJCQl9Ci0JCX0KLQl9CisJCSAgICB9CiAKLQlwcml2YXRlIElGaWxlW10gY29sbGVjdFByb3BlcnR5RmlsZXMoSUNvbnRhaW5lciBjb250YWluZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0PElGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCWNvbGxlY3RQcm9wZXJ0eUZpbGVzKGNvbnRhaW5lciwgZmlsZXMpOwotCQlyZXR1cm4gZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQcm9wZXJ0eUZpbGVzKElDb250YWluZXIgY29udGFpbmVyLCBBcnJheUxpc3Q8SUZpbGU+IGZpbGVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotCQlmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IG1lbWJlcnMpIHsKLQkJCWlmICghcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQkJY29udGludWU7CisJCSAgICAvLyBDb2xsZWN0IG5vbi1KYXZhIHJlc291cmNlcworCQkgICAgT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IGphdmFQcm9qZWN0CisJCQkgICAgLmdldE5vbkphdmFSZXNvdXJjZXMoKTsKKwkJICAgIEFycmF5TGlzdDxJRmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOworCQkgICAgZm9yIChPYmplY3QgcmVzb3VyY2UgOiBub25KYXZhUmVzb3VyY2VzKSB7CiAJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJSUNvbnRhaW5lciBjaGlsZENvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQkJCQljb2xsZWN0UHJvcGVydHlGaWxlcyhjaGlsZENvbnRhaW5lciwgZmlsZXMpOworCQkJICAgIElDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOworCQkJICAgIGNvbGxlY3RQcm9wZXJ0eUZpbGVzKGNvbnRhaW5lciwgZmlsZXMpOwogCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQlpZiAoZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkgPT0gMCAmJiBpc0lnbm9yZWRGaWxlbmFtZShuYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKG5hbWUuZW5kc1dpdGgoUFJPUEVSVElFU19TVUZGSVgpKSB7Ci0JCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQl9CisJCQkgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7CisJCQkgICAgU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKwkJCSAgICBpZiAoaXNJZ25vcmVkRmlsZW5hbWUobmFtZSkpCisJCQkJY29udGludWU7CisJCQkgICAgaWYgKG5hbWUuZW5kc1dpdGgoUFJPUEVSVElFU19TVUZGSVgpKSB7CisJCQkJZmlsZXMuYWRkKGZpbGUpOworCQkJICAgIH0KIAkJCX0KLQkJfQotCX0KKwkJICAgIH0KKwkJICAgIGZvciAoSUZpbGUgZmlsZSA6IGZpbGVzKSB7CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNDb3VudHJ5KFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSAhPSAyKQotCQkJcmV0dXJuIGZhbHNlOwotCQljaGFyIGMxID0gbmFtZS5jaGFyQXQoMCk7Ci0JCWNoYXIgYzIgPSBuYW1lLmNoYXJBdCgxKTsKLQkJcmV0dXJuICdBJyA8PSBjMSAmJiBjMSA8PSAnWicgJiYgJ0EnIDw9IGMyICYmIGMyIDw9ICdaJzsKLQl9Ci0KLQlwcml2YXRlIExvY2FsZSBnZXRMb2NhbGUoU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgY291bnRyeSkgewotCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCkKLQkJCWxhbmd1YWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvdW50cnkgPT0gbnVsbCkKLQkJCWNvdW50cnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEJ1bmRsZShSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHksIExvY2FsZSBsb2NhbGUsIE9iamVjdCByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBuZXcgUmVzb3VyY2VCdW5kbGUoZmFtaWx5LCByZXNvdXJjZSwgbG9jYWxlKTsKLQkJaWYgKCIiLmVxdWFscyhsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSkpCi0JCQlidW5kbGUubG9hZCgpOwotCQlmYW1pbHkuYWRkQnVuZGxlKGJ1bmRsZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZU5hbWUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCWlmICghZmlsZW5hbWUuZW5kc1dpdGgoUFJPUEVSVElFU19TVUZGSVgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlTdHJpbmcgbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sZW5ndGgoKSAtIDExKTsKLQkJaW50IGxlbiA9IG5hbWUubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPiAzICYmIG5hbWUuY2hhckF0KGxlbiAtIDMpID09ICdfJykgewotCQkJaWYgKGxlbiA+IDYgJiYgbmFtZS5jaGFyQXQobGVuIC0gNikgPT0gJ18nKSB7Ci0JCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIGxlbiAtIDYpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbGVuIC0gMyk7CisJCQkvLyBDb252ZXJ0IHBhdGggdG8gcGFja2FnZSBuYW1lIGZvcm1hdAorCQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKKwkJCWludCBzZWdtZW50Q291bnQgPSBwYXRoLnNlZ21lbnRDb3VudCgpOworCQkJaWYgKHNlZ21lbnRDb3VudCA+IDEpIHsKKwkJCSAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudENvdW50IC0gMTsgaSsrKSB7CisJCQkJaWYgKGkgPiAwKQorCQkJCSAgICBidWlsZGVyLmFwcGVuZCgnLicpOworCQkJCWJ1aWxkZXIuYXBwZW5kKHBhdGguc2VnbWVudChpKSk7CisJCQkgICAgfQorCQkJICAgIHBhY2thZ2VOYW1lID0gYnVpbGRlci50b1N0cmluZygpOwogCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KIAotCXByaXZhdGUgU3RyaW5nIGdldExhbmd1YWdlKFN0cmluZyBmaWxlbmFtZSkgewotCQlpZiAoIWZpbGVuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfU1VGRklYKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJU3RyaW5nIG5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGVuZ3RoKCkgLSAxMSk7Ci0JCWludCBsZW4gPSBuYW1lLmxlbmd0aCgpOwotCQlpZiAobGVuID4gMyAmJiBuYW1lLmNoYXJBdChsZW4gLSAzKSA9PSAnXycpIHsKLQkJCWlmIChsZW4gPiA2ICYmIG5hbWUuY2hhckF0KGxlbiAtIDYpID09ICdfJykgewotCQkJCXJldHVybiBuYW1lLnN1YnN0cmluZyhsZW4gLSA1LCBsZW4gLSAzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGxlbiAtIDIpOwotCQkJfQorCQkJU3RyaW5nIGJhc2VOYW1lID0gZ2V0QmFzZU5hbWUoZmlsZS5nZXROYW1lKCkpOworCQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UoZmlsZS5nZXROYW1lKCkpOworCQkJU3RyaW5nIGNvdW50cnkgPSBnZXRDb3VudHJ5KGZpbGUuZ2V0TmFtZSgpKTsKKworCQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gZ2V0T3JDcmVhdGVGYW1pbHkoCisJCQkJcHJvamVjdC5nZXROYW1lKCksIHBsdWdpbklkLCBwYWNrYWdlTmFtZSwKKwkJCQliYXNlTmFtZSk7CisJCQlhZGRCdW5kbGUoZmFtaWx5LCBnZXRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpLCBmaWxlKTsKKwkJICAgIH0KKwogCQl9CisJICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZyhlKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwcml2YXRlIElGaWxlW10gY29sbGVjdFByb3BlcnR5RmlsZXMoSUNvbnRhaW5lciBjb250YWluZXIpCisJICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlBcnJheUxpc3Q8SUZpbGU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsKKwljb2xsZWN0UHJvcGVydHlGaWxlcyhjb250YWluZXIsIGZpbGVzKTsKKwlyZXR1cm4gZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbGxlY3RQcm9wZXJ0eUZpbGVzKElDb250YWluZXIgY29udGFpbmVyLAorCSAgICBBcnJheUxpc3Q8SUZpbGU+IGZpbGVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7CisJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBtZW1iZXJzKSB7CisJICAgIGlmICghcmVzb3VyY2UuZXhpc3RzKCkpCisJCWNvbnRpbnVlOworCSAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7CisJCUlDb250YWluZXIgY2hpbGRDb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7CisJCWNvbGxlY3RQcm9wZXJ0eUZpbGVzKGNoaWxkQ29udGFpbmVyLCBmaWxlcyk7CisJICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKKwkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKwkJaWYgKGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnNlZ21lbnRDb3VudCgpID09IDAKKwkJCSYmIGlzSWdub3JlZEZpbGVuYW1lKG5hbWUpKQorCQkgICAgY29udGludWU7CisJCWlmIChuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfU1VGRklYKSkgeworCQkgICAgZmlsZXMuYWRkKGZpbGUpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ291bnRyeShTdHJpbmcgbmFtZSkgeworCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSAhPSAyKQorCSAgICByZXR1cm4gZmFsc2U7CisJY2hhciBjMSA9IG5hbWUuY2hhckF0KDApOworCWNoYXIgYzIgPSBuYW1lLmNoYXJBdCgxKTsKKwlyZXR1cm4gJ0EnIDw9IGMxICYmIGMxIDw9ICdaJyAmJiAnQScgPD0gYzIgJiYgYzIgPD0gJ1onOworICAgIH0KKworICAgIHByaXZhdGUgTG9jYWxlIGdldExvY2FsZShTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBjb3VudHJ5KSB7CisJaWYgKGxhbmd1YWdlID09IG51bGwpCisJICAgIGxhbmd1YWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKKwlpZiAoY291bnRyeSA9PSBudWxsKQorCSAgICBjb3VudHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEJ1bmRsZShSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHksIExvY2FsZSBsb2NhbGUsCisJICAgIE9iamVjdCByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG5ldyBSZXNvdXJjZUJ1bmRsZShmYW1pbHksIHJlc291cmNlLCBsb2NhbGUpOworCWlmICgiIi5lcXVhbHMobG9jYWxlLmdldExhbmd1YWdlKCkpKQorCSAgICBidW5kbGUubG9hZCgpOworCWZhbWlseS5hZGRCdW5kbGUoYnVuZGxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHsKKwlpZiAoIWZpbGVuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfU1VGRklYKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCVN0cmluZyBuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0gMTEpOworCWludCBsZW4gPSBuYW1lLmxlbmd0aCgpOworCWlmIChsZW4gPiAzICYmIG5hbWUuY2hhckF0KGxlbiAtIDMpID09ICdfJykgeworCSAgICBpZiAobGVuID4gNiAmJiBuYW1lLmNoYXJBdChsZW4gLSA2KSA9PSAnXycpIHsKKwkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIGxlbiAtIDYpOworCSAgICB9IGVsc2UgeworCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbGVuIC0gMyk7CisJICAgIH0KKwl9CisJcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFuZ3VhZ2UoU3RyaW5nIGZpbGVuYW1lKSB7CisJaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChQUk9QRVJUSUVTX1NVRkZJWCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwlTdHJpbmcgbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sZW5ndGgoKSAtIDExKTsKKwlpbnQgbGVuID0gbmFtZS5sZW5ndGgoKTsKKwlpZiAobGVuID4gMyAmJiBuYW1lLmNoYXJBdChsZW4gLSAzKSA9PSAnXycpIHsKKwkgICAgaWYgKGxlbiA+IDYgJiYgbmFtZS5jaGFyQXQobGVuIC0gNikgPT0gJ18nKSB7CisJCXJldHVybiBuYW1lLnN1YnN0cmluZyhsZW4gLSA1LCBsZW4gLSAzKTsKKwkgICAgfSBlbHNlIHsKKwkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGxlbiAtIDIpOworCSAgICB9CisJfQorCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldENvdW50cnkoU3RyaW5nIGZpbGVuYW1lKSB7CisJaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChQUk9QRVJUSUVTX1NVRkZJWCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwlTdHJpbmcgbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sZW5ndGgoKSAtIDExKTsKKwlpbnQgbGVuID0gbmFtZS5sZW5ndGgoKTsKKwlpZiAobGVuID4gMyAmJiBuYW1lLmNoYXJBdChsZW4gLSAzKSA9PSAnXycpIHsKKwkgICAgaWYgKGxlbiA+IDYgJiYgbmFtZS5jaGFyQXQobGVuIC0gNikgPT0gJ18nKSB7CisJCXJldHVybiBuYW1lLnN1YnN0cmluZyhsZW4gLSAyKTsKKwkgICAgfSBlbHNlIHsKIAkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJICAgIH0KIAl9CisJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisgICAgfQogCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q291bnRyeShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChQUk9QRVJUSUVTX1NVRkZJWCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCVN0cmluZyBuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0gMTEpOwotCQlpbnQgbGVuID0gbmFtZS5sZW5ndGgoKTsKLQkJaWYgKGxlbiA+IDMgJiYgbmFtZS5jaGFyQXQobGVuIC0gMykgPT0gJ18nKSB7Ci0JCQlpZiAobGVuID4gNiAmJiBuYW1lLmNoYXJBdChsZW4gLSA2KSA9PSAnXycpIHsKLQkJCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGVuIC0gMik7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KKyAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlRmFtaWx5IGdldE9yQ3JlYXRlRmFtaWx5KFN0cmluZyBwcm9qZWN0TmFtZSwKKwkgICAgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBiYXNlTmFtZSkgewogCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZUZhbWlseSBnZXRPckNyZWF0ZUZhbWlseShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAotCQkJU3RyaW5nIGJhc2VOYW1lKSB7CisJLy8gSWdub3JlIHByb2plY3QgbmFtZQorCWlmIChwbHVnaW5JZCAhPSBudWxsKQorCSAgICBwcm9qZWN0TmFtZSA9IG51bGw7CiAKLQkJLy8gSWdub3JlIHByb2plY3QgbmFtZQotCQlpZiAocGx1Z2luSWQgIT0gbnVsbCkKLQkJCXByb2plY3ROYW1lID0gbnVsbDsKLQotCQlmb3IgKFJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA6IGJ1bmRsZUZhbWlsaWVzKSB7Ci0JCQlpZiAoYXJlRXF1YWwoZmFtaWx5LmdldFByb2plY3ROYW1lKCksIHByb2plY3ROYW1lKQotCQkJCQkmJiBhcmVFcXVhbChmYW1pbHkuZ2V0UGx1Z2luSWQoKSwgcGx1Z2luSWQpCi0JCQkJCSYmIGFyZUVxdWFsKGZhbWlseS5nZXRQYWNrYWdlTmFtZSgpLCBwYWNrYWdlTmFtZSkKLQkJCQkJJiYgYXJlRXF1YWwoZmFtaWx5LmdldEJhc2VOYW1lKCksIGJhc2VOYW1lKSkgewotCQkJCXJldHVybiBmYW1pbHk7Ci0JCQl9Ci0JCX0KLQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gbmV3IFJlc291cmNlQnVuZGxlRmFtaWx5KAotCQkJdGhpcywKLQkJCXByb2plY3ROYW1lLAotCQkJcGx1Z2luSWQsCi0JCQlwYWNrYWdlTmFtZSwKLQkJCWJhc2VOYW1lKTsKLQkJYnVuZGxlRmFtaWxpZXMuYWRkKGZhbWlseSk7CisJZm9yIChSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgOiBidW5kbGVGYW1pbGllcykgeworCSAgICBpZiAoYXJlRXF1YWwoZmFtaWx5LmdldFByb2plY3ROYW1lKCksIHByb2plY3ROYW1lKQorCQkgICAgJiYgYXJlRXF1YWwoZmFtaWx5LmdldFBsdWdpbklkKCksIHBsdWdpbklkKQorCQkgICAgJiYgYXJlRXF1YWwoZmFtaWx5LmdldFBhY2thZ2VOYW1lKCksIHBhY2thZ2VOYW1lKQorCQkgICAgJiYgYXJlRXF1YWwoZmFtaWx5LmdldEJhc2VOYW1lKCksIGJhc2VOYW1lKSkgewogCQlyZXR1cm4gZmFtaWx5OworCSAgICB9CiAJfQorCVJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA9IG5ldyBSZXNvdXJjZUJ1bmRsZUZhbWlseSh0aGlzLAorCQlwcm9qZWN0TmFtZSwgcGx1Z2luSWQsIHBhY2thZ2VOYW1lLCBiYXNlTmFtZSk7CisJYnVuZGxlRmFtaWxpZXMuYWRkKGZhbWlseSk7CisJcmV0dXJuIGZhbWlseTsKKyAgICB9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNJZ25vcmVkRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiBmaWxlbmFtZS5lcXVhbHMoImJ1aWxkLnByb3BlcnRpZXMiKSB8fCBmaWxlbmFtZS5lcXVhbHMoImxvZ2dpbmcucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CisgICAgcHJpdmF0ZSBib29sZWFuIGlzSWdub3JlZEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkgeworCXJldHVybiBmaWxlbmFtZS5lcXVhbHMoImJ1aWxkLnByb3BlcnRpZXMiKSB8fCBmaWxlbmFtZS5lcXVhbHMoImxvZ2dpbmcucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICB9CiAKLQlwcml2YXRlIGJvb2xlYW4gYXJlRXF1YWwoU3RyaW5nIHN0cjEsIFN0cmluZyBzdHIyKSB7Ci0JCXJldHVybiBzdHIxID09IG51bGwgJiYgc3RyMiA9PSBudWxsIHx8IHN0cjEgIT0gbnVsbCAmJiBzdHIxLmVxdWFscyhzdHIyKTsKLQl9CisgICAgcHJpdmF0ZSBib29sZWFuIGFyZUVxdWFsKFN0cmluZyBzdHIxLCBTdHJpbmcgc3RyMikgeworCXJldHVybiBzdHIxID09IG51bGwgJiYgc3RyMiA9PSBudWxsIHx8IHN0cjEgIT0gbnVsbAorCQkmJiBzdHIxLmVxdWFscyhzdHIyKTsKKyAgICB9CiAKIH0K