ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL01vZGVsSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL2NvcmUvTW9kZWxIYW5kbGVyLmphdmEKaW5kZXggYTFmNmExYi4uOTUzZjY4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL2NvcmUvTW9kZWxIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL2NvcmUvTW9kZWxIYW5kbGVyLmphdmEKQEAgLTU4Miw2ICs1ODIsNyBAQAogCQlGbG93RWxlbWVudHNDb250YWluZXIgY29udGFpbmVyID0gZ2V0Rmxvd0VsZW1lbnRDb250YWluZXIodGFyZ2V0KTsKIAkJaWYgKGNvbnRhaW5lci5nZXRMYW5lU2V0cygpLmlzRW1wdHkoKSkgewogCQkJTGFuZVNldCBsYW5lU2V0ID0gY3JlYXRlKExhbmVTZXQuY2xhc3MpOworCQkJbGFuZVNldC5zZXROYW1lKCJMYW5lIFNldCAiK01vZGVsVXRpbC5nZXRJRE51bWJlciggbGFuZVNldC5nZXRJZCgpICkpOwogCQkJY29udGFpbmVyLmdldExhbmVTZXRzKCkuYWRkKGxhbmVTZXQpOwogCQl9CiAJCWNvbnRhaW5lci5nZXRMYW5lU2V0cygpLmdldCgwKS5nZXRMYW5lcygpLmFkZChsYW5lKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL21lcnJpbWFjL2NsYWQvQWJzdHJhY3RMaXN0Q29tcG9zaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvY29yZS9tZXJyaW1hYy9jbGFkL0Fic3RyYWN0TGlzdENvbXBvc2l0ZS5qYXZhCmluZGV4IGUyMTM0NGYuLmJjYTgzY2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL21lcnJpbWFjL2NsYWQvQWJzdHJhY3RMaXN0Q29tcG9zaXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL2NvcmUvbWVycmltYWMvY2xhZC9BYnN0cmFjdExpc3RDb21wb3NpdGUuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUuQWN0aXZhdG9yOwpAQCAtMjIsMTEgKzIzLDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLnV0aWxzLk1vZGVsVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CkBAIC03MDIsMTIgKzcwNSw3MSBAQAogCSAgICByZXR1cm4gc2VjdGlvbjsKIAl9CiAKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKHRoaXMuYnVzaW5lc3NPYmplY3QgPT0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgJiYKLQkJCQl0aGlzLmZlYXR1cmUgPT0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSkgewotCQkJZmluYWwgRUxpc3Q8RU9iamVjdD4gbGlzdCA9IChFTGlzdDxFT2JqZWN0PilidXNpbmVzc09iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobGlzdCk7CisJCUVMaXN0PEVPYmplY3Q+IHRhYmxlID0gKEVMaXN0PEVPYmplY3Q+KWJ1c2luZXNzT2JqZWN0LmVHZXQoZmVhdHVyZSk7CisJCU9iamVjdCBuID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CisJCWlmICh0YWJsZS5jb250YWlucyhuKSkgeworCQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQodGFibGUpOworCQkJcmV0dXJuOyAvLyBxdWljayBleGl0IGJlZm9yZSB0aGUgZXhoYXVzdGl2ZSBzZWFyY2ggdGhhdCBmb2xsb3dzCiAJCX0KKwkJaWYgKG4gaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlIYXNoU2V0PE9iamVjdD4gdmlzaXRlZCA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsgCisJCQlpZiAocmVmcmVzaElmTmVlZGVkUmVjdXJzaXZlKChFT2JqZWN0KW4sIHRhYmxlLCB2aXNpdGVkKSkKKwkJCQlyZXR1cm47CisJCX0KKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKwlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaElmTmVlZGVkUmVjdXJzaXZlKEVPYmplY3QgdmFsdWUsIEVMaXN0PEVPYmplY3Q+IHRhYmxlLCBIYXNoU2V0PE9iamVjdD4gdmlzaXRlZCkgeworCQlmb3IgKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmIDogdmFsdWUuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpKSB7CisJCQl0cnkgeworCQkJCU9iamVjdCB2ID0gdmFsdWUuZUdldChmKTsKKwkJCQlpZiAoIXZpc2l0ZWQuY29udGFpbnModikpIHsKKwkJCQkJdmlzaXRlZC5hZGQodik7CisJCQkJCWlmICh2IGluc3RhbmNlb2YgTGlzdCkgeworCQkJCQkJaWYgKCEoKExpc3QpdikuaXNFbXB0eSgpKQorCQkJCQkJCWlmIChyZWZyZXNoSWZOZWVkZWRSZWN1cnNpdmUoKExpc3QpdiwgdGFibGUsIHZpc2l0ZWQpKQorCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQllbHNlIGlmICh2IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJCQkJaWYgKHJlZnJlc2hJZk5lZWRlZCgoRU9iamVjdCl2LCB0YWJsZSkpCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBzb21lIGdldHRlcnMgbWF5IHRocm93IGV4Y2VwdGlvbnMgLSBpZ25vcmUgdGhvc2UKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmcmVzaElmTmVlZGVkKHZhbHVlLCB0YWJsZSk7CisJfQorCisJc3RhdGljIGludCBjb3VudCA9IDA7CisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKwlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaElmTmVlZGVkUmVjdXJzaXZlKExpc3QgbGlzdCwgRUxpc3Q8RU9iamVjdD4gdGFibGUsIEhhc2hTZXQ8T2JqZWN0PiB2aXNpdGVkKSB7CisJCWZvciAoT2JqZWN0IHYgOiBsaXN0KSB7CisJCQlpZiAoIXZpc2l0ZWQuY29udGFpbnModikpIHsKKwkJCQl2aXNpdGVkLmFkZCh2KTsKKwkJCQlpZiAodiBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCQkJaWYgKHJlZnJlc2hJZk5lZWRlZFJlY3Vyc2l2ZSgoTGlzdCl2LCB0YWJsZSwgdmlzaXRlZCkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZSBpZiAodiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCQkJaWYgKHJlZnJlc2hJZk5lZWRlZFJlY3Vyc2l2ZSgoRU9iamVjdCl2LCB0YWJsZSwgdmlzaXRlZCkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoSWZOZWVkZWQoRU9iamVjdCB2YWx1ZSwgRUxpc3Q8RU9iamVjdD4gdGFibGUpIHsKKwkJaWYgKHRhYmxlLmNvbnRhaW5zKHZhbHVlKSkgeworCQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQodGFibGUpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL21lcnJpbWFjL2NsYWQvTGlzdEFuZERldGFpbENvbXBvc2l0ZUJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL21lcnJpbWFjL2NsYWQvTGlzdEFuZERldGFpbENvbXBvc2l0ZUJhc2UuamF2YQppbmRleCBkNjFkOTFmLi45OTFhMDU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvY29yZS9tZXJyaW1hYy9jbGFkL0xpc3RBbmREZXRhaWxDb21wb3NpdGVCYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL2NvcmUvbWVycmltYWMvY2xhZC9MaXN0QW5kRGV0YWlsQ29tcG9zaXRlQmFzZS5qYXZhCkBAIC0yNDEsMTIgKzI0MSwyMCBAQAogCQkJCWlmIChjIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7CiAJCQkJCWdldEFsbENoaWxkV2lkZ2V0cygoQ29tcG9zaXRlKWMsa2lkcyk7CiAJCQkJfQotCQkJCWlmICghYy5pc0Rpc3Bvc2VkKCkpCi0JCQkJCWtpZHMuYWRkKGMpOworCQkJCWlmICghYy5pc0Rpc3Bvc2VkKCkgJiYKKwkJCQkJYy5nZXREYXRhKElDb25zdGFudHMuTk9USUZZX0NIQU5HRV9MSVNURU5FUl9LRVkpIGluc3RhbmNlb2YgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQkJCQkJa2lkcy5hZGQoYyk7CisJCQkJfQogCQkJfQogCQl9CiAJfQogCQorCS8vIFRPRE86IEZpZ3VyZSBvdXQgYSBicm9hZGVyIG1ldGhvZCBvZiBkZXRlY3RpbmcgbW9kZWwgY2hhbmdlcy4KKwkvLyBUaGlzIGxpc3RlbmVyIGlzIG9ubHkgY2FsbGVkIEFGVEVSIGEgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCwKKwkvLyBpdCB3aWxsIG5vdCByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBtb2RlbCBjaGFuZ2VzIGluc2lkZSBhIHR4bi4KKwkvLyBTbywgd2hpbGUgdGhpcyB3b3JrcyBpbiB0aGUgUHJvcGVydHkgU2hlZXQgcGFnZXMsIHRoaW5ncyBsaWtlCisJLy8gdGhlIE9iamVjdEVkaXRpbmdEaWFsb2cgKHdoaWNoIG1ha2VzIGNoYW5nZXMgaW4gdGhlIGN1cnJlbnQgdHhuKQorCS8vIHdpbGwgbm90IGNhdXNlIG90aGVyIHdpZGdldHMgaW4gdGhlIGRpYWxvZyB0byBiZSBub3RpZmllZC4KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCByZXNvdXJjZVNldENoYW5nZWQoUmVzb3VyY2VTZXRDaGFuZ2VFdmVudCBldmVudCkgewogCQlmaW5hbCBMaXN0PE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9ucyA9IG5ldyBBcnJheUxpc3Q8Tm90aWZpY2F0aW9uPigpOwpAQCAtMjY3LDcgKzI3NSw3IEBACiAJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewogCQkJcHVibGljIHZvaWQgcnVuKCkgewogCQkJCUxpc3Q8Q29udHJvbD5raWRzID0gbmV3IEFycmF5TGlzdDxDb250cm9sPigpOwotCQkJCUNvbXBvc2l0ZSBwYXJlbnQgPSBMaXN0QW5kRGV0YWlsQ29tcG9zaXRlQmFzZS50aGlzLmdldFBhcmVudCgpOworCQkJCUNvbXBvc2l0ZSBwYXJlbnQgPSBMaXN0QW5kRGV0YWlsQ29tcG9zaXRlQmFzZS50aGlzOwogCQkJCUFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24gc2VjdGlvbiA9IExpc3RBbmREZXRhaWxDb21wb3NpdGVCYXNlLnRoaXMuZ2V0UHJvcGVydHlTZWN0aW9uKCk7CiAJCQkJaWYgKHNlY3Rpb24hPW51bGwgJiYgc2VjdGlvbi5nZXRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSgpIT1udWxsKSB7CiAJCQkJCXBhcmVudCA9IChDb21wb3NpdGUpc2VjdGlvbi5nZXRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSgpLmdldENvbnRyb2woKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL21lcnJpbWFjL2NsYWQvVGFibGVDb2x1bW4uamF2YSBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL21lcnJpbWFjL2NsYWQvVGFibGVDb2x1bW4uamF2YQppbmRleCA2NWExNzg0Li40ZGE1ZDc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvY29yZS9tZXJyaW1hYy9jbGFkL1RhYmxlQ29sdW1uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL2NvcmUvbWVycmltYWMvY2xhZC9UYWJsZUNvbHVtbi5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiAJLy8gVGhlIGNvbHVtbiBjZWxsIGVkaXRvcgogCXByb3RlY3RlZCBDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBudWxsOwogCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlID0gdHJ1ZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGhlYWRlclRleHQgPSBudWxsOwogCiAJcHVibGljIFRhYmxlQ29sdW1uKEVPYmplY3QgbywgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKIAkJdGhpcyhudWxsLG8sZik7CkBAIC00Niw2ICs0NywxNiBAQAogCQlvYmplY3QgPSBvOwogCQlmZWF0dXJlID0gZjsKIAl9CisKKwlwdWJsaWMgVGFibGVDb2x1bW4oRU9iamVjdCBvLCBTdHJpbmcgZikgeworCQl0aGlzKG51bGwsbyxmKTsKKwl9CisKKwlwdWJsaWMgVGFibGVDb2x1bW4oQWJzdHJhY3RMaXN0Q29tcG9zaXRlIGFic3RyYWN0TGlzdENvbXBvc2l0ZSwgRU9iamVjdCBvLCBTdHJpbmcgZikgeworCQl0aGlzLmxpc3RDb21wb3NpdGUgPSBhYnN0cmFjdExpc3RDb21wb3NpdGU7CisJCW9iamVjdCA9IG87CisJCWZlYXR1cmUgPSBvLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmKTsKKwl9CiAJCiAJcHVibGljIHZvaWQgc2V0T3duZXIoQWJzdHJhY3RMaXN0Q29tcG9zaXRlIGFic3RyYWN0TGlzdENvbXBvc2l0ZSkgewogCQl0aGlzLmxpc3RDb21wb3NpdGUgPSBhYnN0cmFjdExpc3RDb21wb3NpdGU7CkBAIC01NSw4ICs2NiwxNSBAQAogCQl0YWJsZVZpZXdlciA9IHQ7CiAJfQogCQorCXB1YmxpYyB2b2lkIHNldEhlYWRlclRleHQoU3RyaW5nIHRleHQpIHsKKwkJaGVhZGVyVGV4dCA9IHRleHQ7CisJfQorCQogCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyVGV4dCgpIHsKKwkJaWYgKGhlYWRlclRleHQhPW51bGwpCisJCQlyZXR1cm4gaGVhZGVyVGV4dDsKKwkJCiAJCVN0cmluZyB0ZXh0ID0gIiI7CiAJCWlmIChmZWF0dXJlIT1udWxsKSB7CiAJCQlpZiAoZmVhdHVyZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL21lcnJpbWFjL2RpYWxvZ3MvRmVhdHVyZUVkaXRpbmdEaWFsb2cuamF2YSBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL21lcnJpbWFjL2RpYWxvZ3MvRmVhdHVyZUVkaXRpbmdEaWFsb2cuamF2YQppbmRleCAyMGY4YjdlLi5hM2ZhN2NhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvY29yZS9tZXJyaW1hYy9kaWFsb2dzL0ZlYXR1cmVFZGl0aW5nRGlhbG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL2NvcmUvbWVycmltYWMvZGlhbG9ncy9GZWF0dXJlRWRpdGluZ0RpYWxvZy5qYXZhCkBAIC0xOCwxMCArMTgsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5lZGl0b3IuRGlhZ3JhbUVkaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwogCiBwdWJsaWMgY2xhc3MgRmVhdHVyZUVkaXRpbmdEaWFsb2cgZXh0ZW5kcyBPYmplY3RFZGl0aW5nRGlhbG9nIHsKIApAQCAtNDIsNyArNDYsNyBAQAogCQkJTW9kZWxTdWJjbGFzc1NlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgTW9kZWxTdWJjbGFzc1NlbGVjdGlvbkRpYWxvZyhlZGl0b3IsIG9iamVjdCwgZmVhdHVyZSk7CiAJCQlpZiAoZGlhbG9nLm9wZW4oKT09V2luZG93Lk9LKXsKIAkJCQllY2xhc3MgPSAoRUNsYXNzKWRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCQluZXdPYmplY3QgPSBNb2RlbFV0aWwuY3JlYXRlRmVhdHVyZShvYmplY3QsIGZlYXR1cmUsIGVjbGFzcyk7CisJCQkJbmV3T2JqZWN0ID0gY3JlYXRlTmV3T2JqZWN0KG9iamVjdCwgZmVhdHVyZSwgZWNsYXNzKTsKIAkJCX0KIAkJCWVsc2UKIAkJCQljYW5jZWwgPSB0cnVlOwpAQCAtNTMsNiArNTcsMjMgQEAKIAkJcmV0dXJuIGNvbnRlbnQ7CiAJfQogCQorCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZU5ld09iamVjdChmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGZpbmFsIEVDbGFzcyBlY2xhc3MpIHsKKwkJZmluYWwgRU9iamVjdFtdIHJlc3VsdCA9IG5ldyBFT2JqZWN0WzFdOworCQlmaW5hbCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW5JbXBsKWVkaXRvci5nZXRFZGl0aW5nRG9tYWluKCk7CisJCWlmIChkb21haW4hPW51bGwpIHsKKwkJCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKGRvbWFpbikgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKKwkJCQkJcmVzdWx0WzBdID0gTW9kZWxVdGlsLmNyZWF0ZUZlYXR1cmUob2JqZWN0LCBmZWF0dXJlLCBlY2xhc3MpOworCQkJCX0KKwkJCX0pOworCQl9CisJCWVsc2UgeworCQkJcmVzdWx0WzBdID0gTW9kZWxVdGlsLmNyZWF0ZUZlYXR1cmUob2JqZWN0LCBmZWF0dXJlLCBlY2xhc3MpOworCQl9CisJCXJldHVybiByZXN1bHRbMF07CisJfQorCQogCXB1YmxpYyB2b2lkIGFib3V0VG9PcGVuKCkgewogCQlTdHJpbmcgdGl0bGU7CiAJCWlmIChjcmVhdGVOZXcpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvY29yZS91dGlscy9Nb2RlbFV0aWwuamF2YSBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL3V0aWxzL01vZGVsVXRpbC5qYXZhCmluZGV4IGQyZDJkY2UuLmNkYWExZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL3V0aWxzL01vZGVsVXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9jb3JlL3V0aWxzL01vZGVsVXRpbC5qYXZhCkBAIC05NTgsMTIgKzk1OCwxMSBAQAogCQkKIAkJaWYgKHZhbHVlQ2hhbmdlZCkgewogCQkJdHJ5IHsKLQkJCQlJbnNlcnRpb25BZGFwdGVyIGluc2VydGlvbkFkYXB0ZXIgPSBBZGFwdGVyVXRpbC5hZGFwdCh2YWx1ZSwgSW5zZXJ0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGluc2VydGlvbkFkYXB0ZXIhPW51bGwpIHsKKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CiAJCQkJCS8vIG1ha2Ugc3VyZSB0aGUgbmV3IG9iamVjdCBpcyBhZGRlZCB0byBpdHMgY29udHJvbCBmaXJzdAogCQkJCQkvLyBzbyB0aGF0IGl0IGluaGVyaXRzIHRoZSBjb250cm9sJ3MgUmVzb3VyY2UgYW5kIEVkaXRpbmdEb21haW4KIAkJCQkJLy8gYmVmb3JlIHdlIHRyeSB0byBjaGFuZ2UgaXRzIHZhbHVlLgotCQkJCQlpbnNlcnRpb25BZGFwdGVyLmV4ZWN1dGUoKTsKKwkJCQkJSW5zZXJ0aW9uQWRhcHRlci5leGVjdXRlSWZOZWVkZWQoKEVPYmplY3QpdmFsdWUpOwogCQkJCX0KIAkJCQkKIAkJCQlpZiAoaXNFbXB0eSh2YWx1ZSkpewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5ydW50aW1lLmpib3NzLmpicG01L3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3J1bnRpbWUvamJvc3MvamJwbTUvbW9kZWwvdXRpbC9Nb2RlbFJlc291cmNlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5ydW50aW1lLmpib3NzLmpicG01L3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3J1bnRpbWUvamJvc3MvamJwbTUvbW9kZWwvdXRpbC9Nb2RlbFJlc291cmNlSW1wbC5qYXZhCmluZGV4IDEzMTVmYjAuLmI1YjFjNmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIucnVudGltZS5qYm9zcy5qYnBtNS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci9ydW50aW1lL2pib3NzL2picG01L21vZGVsL3V0aWwvTW9kZWxSZXNvdXJjZUltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvcnVudGltZS9qYm9zcy9qYnBtNS9tb2RlbC91dGlsL01vZGVsUmVzb3VyY2VJbXBsLmphdmEKQEAgLTEsMjQwICsxLDI0NyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgUmVkIEhhdCwgSW5jLg0KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQotICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLA0KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiBSZWQgSGF0LCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEJvYiBCcm9kdA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqDQotICogPGNvcHlyaWdodD4NCi0gKiA8L2NvcHlyaWdodD4NCi0gKg0KLSAqICRJZCQNCi0gKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIucnVudGltZS5qYm9zcy5qYnBtNS5tb2RlbC51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQnBtbjJQYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5DYWxsQWN0aXZpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkNhbGxhYmxlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1vZGVsLkJwbW4yTW9kZWxlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tb2RlbC5CcG1uMk1vZGVsZXJSZXNvdXJjZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIucnVudGltZS5qYm9zcy5qYnBtNS5tb2RlbC5Nb2RlbFBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTExvYWQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTExvYWRJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU3RyaW5nOw0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUubW9kZWwudXRpbC5Nb2RlbFJlc291cmNlRmFjdG9yeUltcGwNCi0gKiBAZ2VuZXJhdGVkIE5PVA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2RlbFJlc291cmNlSW1wbCBleHRlbmRzIEJwbW4yTW9kZWxlclJlc291cmNlSW1wbCB7DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4NCi0JICogQGdlbmVyYXRlZCBOT1QNCi0JICovDQotCXB1YmxpYyBNb2RlbFJlc291cmNlSW1wbChVUkkgdXJpKSB7DQotCQlzdXBlcih1cmkpOw0KLQl9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBob29rIGluIG91ciBvd24gWG1sSGFuZGxlcg0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7DQotICAgICAgICByZXR1cm4gbmV3IFhNTExvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKSB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHJvdGVjdGVkIERlZmF1bHRIYW5kbGVyIG1ha2VEZWZhdWx0SGFuZGxlcigpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFhtbEhhbmRsZXIocmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIFhNTFNhdmUgY3JlYXRlWE1MU2F2ZSgpIHsNCi0JCXJldHVybiBuZXcgQnBtbjJNb2RlbGVyWE1MU2F2ZShjcmVhdGVYTUxIZWxwZXIoKSkgew0KLQkJCQ0KLQkJCXByaXZhdGUgYm9vbGVhbiBuZWVkVGFyZ2V0TmFtZXNwYWNlID0gdHJ1ZTsNCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlRmVhdHVyZShFT2JqZWN0IG8sIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7DQotCQkJCWlmIChCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50YXRpb25fVGV4dCgpLmVxdWFscyhmKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJaWYgKEJwbW4yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ybWFsRXhwcmVzc2lvbl9Cb2R5KCkuZXF1YWxzKGYpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQlyZXR1cm4gc3VwZXIuc2hvdWxkU2F2ZUZlYXR1cmUobywgZik7DQotCQkJfQ0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCB2b2lkIGluaXQoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIE1hcDw/LCA/PiBvcHRpb25zKSB7DQotCQkJCXN1cGVyLmluaXQocmVzb3VyY2UsIG9wdGlvbnMpOw0KLQkJICAgICAgICBkb2MgPSBuZXcgWE1MU3RyaW5nKEludGVnZXIuTUFYX1ZBTFVFLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG51bGwpIHsNCi0JCSAgICAgICAgCUBPdmVycmlkZQ0KLQkJICAgICAgICAJcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsNCi0JCSAgICAgICAgCQlpZiAoInRhcmdldE5hbWVzcGFjZSIuZXF1YWxzKG5hbWUpKQ0KLQkJICAgICAgICAJCQluZWVkVGFyZ2V0TmFtZXNwYWNlID0gZmFsc2U7DQotCQkgICAgICAgIAkJZWxzZSBpZiAoWFNJX1NDSEVNQV9MT0NBVElPTi5lcXVhbHMobmFtZSkpIHsNCi0JCSAgICAgICAgCQkJdmFsdWUgPSAiaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvQlBNTi8yMDEwMDUyNC9NT0RFTCBCUE1OMjAueHNkIjsNCi0JCSAgICAgICAgCQl9DQotCQkgICAgICAgIAkJc3VwZXIuYWRkQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsNCi0JCSAgICAgICAgCX0NCi0JCSAgICAgICAgfTsNCi0JCQl9DQotCQkJICANCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSB7DQotCQkJCWlmIChuZWVkVGFyZ2V0TmFtZXNwYWNlKQ0KLQkJCQkJZG9jLmFkZEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgTW9kZWxQYWNrYWdlLmVOU19VUkkpOw0KLQkJCQlzdXBlci5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotDQotCS8qKg0KLSAgICAgKiBXZSBuZWVkIGV4dGVuZCB0aGUgc3RhbmRhcmQgU0FYWE1MSGFuZGxlciB0byBob29rIGludG8gdGhlIGhhbmRsaW5nIG9mIGF0dHJpYnV0ZSByZWZlcmVuY2VzDQotICAgICAqIHdoaWNoIG1heSBiZSBlaXRoZXIgc2ltcGxlIElEIFN0cmluZ3Mgb3IgUU5hbWVzLiBXZSdsbCBzZWFyY2ggdGhyb3VnaCBhbGwgb2YgdGhlIG9iamVjdHMnDQotICAgICAqIElEcyBmaXJzdCB0byBmaW5kIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IuIElmIG5vdCwgd2UnbGwgdHJ5IGEgUU5hbWUgc2VhcmNoLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNb2RlbFhtbEhhbmRsZXIgZXh0ZW5kcyBCcG1uMk1vZGVsZXJYbWxIYW5kbGVyIHsNCi0NCi0gICAgICAgIHB1YmxpYyBNb2RlbFhtbEhhbmRsZXIoWE1MUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFhNTEhlbHBlciBoZWxwZXIsIE1hcDw/LCA/PiBvcHRpb25zKSB7DQotICAgICAgICAgICAgc3VwZXIoeG1pUmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucyk7DQotICAgICAgICB9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQkJZm9yIChpbnQgaT0wOyBpPGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7ICsraSApIHsNCi0JCQkJU3RyaW5nIG4gPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOw0KLQkJCQlpZiAobi5zdGFydHNXaXRoKCJ4bWxuczoiKSkgew0KLQkJCQkJU3RyaW5nIHYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOw0KLQkJCQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TnNVUkkoKS5lcXVhbHModikpIHsNCi0JCQkJCQlCcG1uMk1vZGVsZXJGYWN0b3J5LnNldEVuYWJsZU1vZGVsRXh0ZW5zaW9ucyhmYWxzZSk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQkJc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cmlidXRlcyk7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgew0KLQkJCXN1cGVyLmVuZERvY3VtZW50KCk7DQotCQkJQnBtbjJNb2RlbGVyRmFjdG9yeS5zZXRFbmFibGVNb2RlbEV4dGVuc2lvbnModHJ1ZSk7DQotCQl9DQotDQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHsNCi0JCQkNCi0JCQlzdXBlci5wcm9jZXNzRWxlbWVudChuYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSk7DQotCQkJDQotCQkJLy8gdWdseSBoYWNrIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzU1Njg2DQotCQkJLy8gUmVtb3ZlIHRoZSAidHlwZSIgYXR0cmlidXRlIGZyb20gdGhlIGZlYXR1cmUgcGFyZW50TWFwIGlmIHRoZXJlIGlzIG9uZS4NCi0JCQkvLyBUaGUgWFNJIHR5cGUgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgRU9iamVjdCwNCi0JCQkvLyBzbyBhbnkgInR5cGUiIGluIHRoZSBmZWF0dXJlIHBhcmVudE1hcCB3aWxsIGJlIGEgZHVwbGljYXRlIHdoaWNoIHdpbGwNCi0JCQkvLyBjYXVzZSBwcm9ibGVtcyBkdXJpbmcgcGFyc2luZy4NCi0JCQkvLyBTZWUgYWxzbyBnZXRYU0lUeXBlKCkNCi0JCQlFT2JqZWN0IGNoaWxkT2JqZWN0ID0gb2JqZWN0cy5wZWVrRU9iamVjdCgpOw0KLQkJCWlmIChjaGlsZE9iamVjdCE9bnVsbCkgew0KLQkJCQl0cnkgew0KLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGFueUF0dHJpYnV0ZSA9IGNoaWxkT2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShCcG1uMlBhY2thZ2UuQkFTRV9FTEVNRU5UX19BTllfQVRUUklCVVRFKTsNCi0JCQkJCWlmIChhbnlBdHRyaWJ1dGUhPW51bGwpIHsNCi0JCQkJCQlMaXN0PEJhc2ljRmVhdHVyZU1hcC5FbnRyeT4gYW55TWFwID0gKExpc3Q8QmFzaWNGZWF0dXJlTWFwLkVudHJ5PiljaGlsZE9iamVjdC5lR2V0KGFueUF0dHJpYnV0ZSk7DQotCQkJCQkJaWYgKGFueU1hcCE9bnVsbCkgew0KLQkJCQkJCQlMaXN0PEJhc2ljRmVhdHVyZU1hcC5FbnRyeT4gcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8QmFzaWNGZWF0dXJlTWFwLkVudHJ5PigpOw0KLQkJCQkJCQlmb3IgKEJhc2ljRmVhdHVyZU1hcC5FbnRyeSBmZSA6IGFueU1hcCkgew0KLQkJCQkJCQkJaWYgKGZlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgew0KLQkJCQkJCQkJCUVBdHRyaWJ1dGVJbXBsIGEgPSAoRUF0dHJpYnV0ZUltcGwpZmUuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7DQotCQkJCQkJCQkJU3RyaW5nIG4gPSBhLmdldE5hbWUoKTsNCi0JCQkJCQkJCQlTdHJpbmcgbnMgPSBhLmdldEV4dGVuZGVkTWV0YURhdGEoKS5nZXROYW1lc3BhY2UoKTsNCi0JCQkJCQkJCQlpZiAoVFlQRS5lcXVhbHMobikgJiYgWFNJX1VSSS5lcXVhbHMobnMpKSB7DQotCQkJCQkJCQkJCXJlbW92ZWQuYWRkKGZlKTsNCi0JCQkJCQkJCQl9DQotCQkJCQkJCQl9DQotCQkJCQkJCX0NCi0JCQkJCQkJaWYgKHJlbW92ZWQuc2l6ZSgpPjApDQotCQkJCQkJCQlhbnlNYXAucmVtb3ZlQWxsKHJlbW92ZWQpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgew0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFhTSVR5cGUoKSB7DQotCQkJaWYgKGlzTmFtZXNwYWNlQXdhcmUpDQotCQkJCXJldHVybiBhdHRyaWJzLmdldFZhbHVlKEV4dGVuZGVkTWV0YURhdGEuWFNJX1VSSSwNCi0JCQkJCQlYTUxSZXNvdXJjZS5UWVBFKTsNCi0NCi0JCQkvLyBJZiBhbiBwYXJhbWV0ZXIgc3BlY2lmaWVzIG11bHRpcGxlIHhzaTp0eXBlIGRhdGEgdHlwZXMsIHRoZSBsYXN0IG9uZSB3aW5zLg0KLQkJCS8vIE5PVEU6IHdlIG11c3QgY2hlY2sgZm9yICJ0eXBlIiBpbiBhbnkgbmFtZXNwYWNlIHdpdGggdGhlIFVSSQ0KLQkJCS8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0JCQlTdHJpbmcgdmFsdWUgPSBudWxsOw0KLQkJCWludCBsZW5ndGggPSBhdHRyaWJzLmdldExlbmd0aCgpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsNCi0JCQkJYXR0cmlicy5nZXRRTmFtZShpKTsNCi0JCQkJU3RyaW5nIGxvY2FscGFydD0gYXR0cmlicy5nZXRMb2NhbE5hbWUoaSk7DQotCQkJCVN0cmluZyBwcmVmaXggPSBudWxsOw0KLQkJCQlpbnQgY2kgPSBsb2NhbHBhcnQubGFzdEluZGV4T2YoJzonKTsNCi0JCQkJaWYgKGNpPjApIHsNCi0JCQkJCXByZWZpeCA9IGxvY2FscGFydC5zdWJzdHJpbmcoMCwgY2kpOyANCi0JCQkJCWxvY2FscGFydCA9IGxvY2FscGFydC5zdWJzdHJpbmcoY2krMSk7DQotCQkJCX0NCi0JCQkJaWYgKFRZUEUuZXF1YWxzKGxvY2FscGFydCkpIHsNCi0JCQkJCVN0cmluZyB1cmkgPSBoZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7DQotCQkJCQlpZiAoWFNJX1VSSS5lcXVhbHModXJpKSkgew0KLQkJCQkJCXZhbHVlID0gYXR0cmlicy5nZXRWYWx1ZShpKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQlyZXR1cm4gdmFsdWU7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVGcm9tSWQoRU9iamVjdCBvYmplY3QsIEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgU3RyaW5nIGlkcykgew0KLQkJCS8vIHRoZSBDYWxsZWRFbGVtZW50UmVmIGluIENhbGxBY3Rpdml0eSBpcyBqdXN0IGFuIElELiBUaGlzIG1lYW5zIHdlIG5lZWQNCi0JCQkvLyB0byBjcmVhdGUgYSBDYWxsYWJsZUVsZW1lbnQgd2hpY2ggaXMgc2ltcGx5IGEgcHJveHksIG5vdCBhIHJlYWwgb2JqZWN0Lg0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDYWxsQWN0aXZpdHkpIHsNCi0JCQkJQ2FsbEFjdGl2aXR5IGNhID0gKENhbGxBY3Rpdml0eSlvYmplY3Q7DQotCQkJCUNhbGxhYmxlRWxlbWVudCBjZSA9IEJwbW4yTW9kZWxlckZhY3RvcnkuY3JlYXRlKENhbGxhYmxlRWxlbWVudC5jbGFzcyk7DQotCQkJCSgoSW50ZXJuYWxFT2JqZWN0KWNlKS5lU2V0UHJveHlVUkkoVVJJLmNyZWF0ZVVSSShpZHMpKTsNCi0JCQkJY2Euc2V0Q2FsbGVkRWxlbWVudFJlZihjZSk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQkJc3VwZXIuc2V0VmFsdWVGcm9tSWQob2JqZWN0LCBlUmVmZXJlbmNlLCBpZHMpOw0KLQkJfQ0KLSAgICB9DQotfSAvL01vZGVsUmVzb3VyY2VJbXBsDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBhdXRob3IgQm9iIEJyb2R0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIucnVudGltZS5qYm9zcy5qYnBtNS5tb2RlbC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQnBtbjJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkNhbGxBY3Rpdml0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5DYWxsYWJsZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuSW50ZXJmYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tb2RlbC5CcG1uMk1vZGVsZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tb2RlbC5CcG1uMk1vZGVsZXJSZXNvdXJjZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLnV0aWxzLk1vZGVsVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MTG9hZEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFN0cmluZzsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5ydW50aW1lLmpib3NzLmpicG01Lm1vZGVsLnV0aWwuTW9kZWxSZXNvdXJjZUZhY3RvcnlJbXBsCisgKiBAZ2VuZXJhdGVkIE5PVAorICovCitwdWJsaWMgY2xhc3MgTW9kZWxSZXNvdXJjZUltcGwgZXh0ZW5kcyBCcG1uMk1vZGVsZXJSZXNvdXJjZUltcGwgeworCQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgTW9kZWxSZXNvdXJjZUltcGwoVVJJIHVyaSkgeworCQlzdXBlcih1cmkpOworCX0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaG9vayBpbiBvdXIgb3duIFhtbEhhbmRsZXIKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgeworICAgICAgICByZXR1cm4gbmV3IFhNTExvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBtYWtlRGVmYXVsdEhhbmRsZXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFhtbEhhbmRsZXIocmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIFhNTFNhdmUgY3JlYXRlWE1MU2F2ZSgpIHsKKwkJcmV0dXJuIG5ldyBCcG1uMk1vZGVsZXJYTUxTYXZlKGNyZWF0ZVhNTEhlbHBlcigpKSB7CisJCQkKKwkJCXByaXZhdGUgYm9vbGVhbiBuZWVkVGFyZ2V0TmFtZXNwYWNlID0gdHJ1ZTsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlRmVhdHVyZShFT2JqZWN0IG8sIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7CisJCQkJaWYgKEJwbW4yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRhdGlvbl9UZXh0KCkuZXF1YWxzKGYpKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJaWYgKEJwbW4yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ybWFsRXhwcmVzc2lvbl9Cb2R5KCkuZXF1YWxzKGYpKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJcmV0dXJuIHN1cGVyLnNob3VsZFNhdmVGZWF0dXJlKG8sIGYpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGluaXQoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIE1hcDw/LCA/PiBvcHRpb25zKSB7CisJCQkJc3VwZXIuaW5pdChyZXNvdXJjZSwgb3B0aW9ucyk7CisJCSAgICAgICAgZG9jID0gbmV3IFhNTFN0cmluZyhJbnRlZ2VyLk1BWF9WQUxVRSwgcHVibGljSWQsIHN5c3RlbUlkLCBudWxsKSB7CisJCSAgICAgICAgCUBPdmVycmlkZQorCQkgICAgICAgIAlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCQkgICAgICAgIAkJaWYgKCJ0YXJnZXROYW1lc3BhY2UiLmVxdWFscyhuYW1lKSkKKwkJICAgICAgICAJCQluZWVkVGFyZ2V0TmFtZXNwYWNlID0gZmFsc2U7CisJCSAgICAgICAgCQllbHNlIGlmIChYU0lfU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyhuYW1lKSkgeworCQkgICAgICAgIAkJCXZhbHVlID0gImh0dHA6Ly93d3cub21nLm9yZy9zcGVjL0JQTU4vMjAxMDA1MjQvTU9ERUwgQlBNTjIwLnhzZCI7CisJCSAgICAgICAgCQl9CisJCSAgICAgICAgCQlzdXBlci5hZGRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworCQkgICAgICAgIAl9CisJCSAgICAgICAgfTsKKwkJCX0KKwkJCSAgCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpIHsKKwkJCQlpZiAobmVlZFRhcmdldE5hbWVzcGFjZSkKKwkJCQkJZG9jLmFkZEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgTW9kZWxQYWNrYWdlLmVOU19VUkkpOworCQkJCXN1cGVyLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpOworCQkJfQorCQl9OworCX0KKworCS8qKgorICAgICAqIFdlIG5lZWQgZXh0ZW5kIHRoZSBzdGFuZGFyZCBTQVhYTUxIYW5kbGVyIHRvIGhvb2sgaW50byB0aGUgaGFuZGxpbmcgb2YgYXR0cmlidXRlIHJlZmVyZW5jZXMKKyAgICAgKiB3aGljaCBtYXkgYmUgZWl0aGVyIHNpbXBsZSBJRCBTdHJpbmdzIG9yIFFOYW1lcy4gV2UnbGwgc2VhcmNoIHRocm91Z2ggYWxsIG9mIHRoZSBvYmplY3RzJworICAgICAqIElEcyBmaXJzdCB0byBmaW5kIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IuIElmIG5vdCwgd2UnbGwgdHJ5IGEgUU5hbWUgc2VhcmNoLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTW9kZWxYbWxIYW5kbGVyIGV4dGVuZHMgQnBtbjJNb2RlbGVyWG1sSGFuZGxlciB7CisKKyAgICAgICAgcHVibGljIE1vZGVsWG1sSGFuZGxlcihYTUxSZXNvdXJjZSB4bWlSZXNvdXJjZSwgWE1MSGVscGVyIGhlbHBlciwgTWFwPD8sID8+IG9wdGlvbnMpIHsKKyAgICAgICAgICAgIHN1cGVyKHhtaVJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpOworICAgICAgICB9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCQlmb3IgKGludCBpPTA7IGk8YXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgKytpICkgeworCQkJCVN0cmluZyBuID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKKwkJCQlpZiAobi5zdGFydHNXaXRoKCJ4bWxuczoiKSkgeworCQkJCQlTdHJpbmcgdiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7CisJCQkJCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5zVVJJKCkuZXF1YWxzKHYpKSB7CisJCQkJCQlCcG1uMk1vZGVsZXJGYWN0b3J5LnNldEVuYWJsZU1vZGVsRXh0ZW5zaW9ucyhmYWxzZSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHJpYnV0ZXMpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgeworCQkJc3VwZXIuZW5kRG9jdW1lbnQoKTsKKwkJCUJwbW4yTW9kZWxlckZhY3Rvcnkuc2V0RW5hYmxlTW9kZWxFeHRlbnNpb25zKHRydWUpOworCQl9CisKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgeworCQkJCisJCQlzdXBlci5wcm9jZXNzRWxlbWVudChuYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSk7CisJCQkKKwkJCS8vIHVnbHkgaGFjayBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1NTY4NgorCQkJLy8gUmVtb3ZlIHRoZSAidHlwZSIgYXR0cmlidXRlIGZyb20gdGhlIGZlYXR1cmUgcGFyZW50TWFwIGlmIHRoZXJlIGlzIG9uZS4KKwkJCS8vIFRoZSBYU0kgdHlwZSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHVzZWQgdG8gY29uc3RydWN0IHRoZSBFT2JqZWN0LAorCQkJLy8gc28gYW55ICJ0eXBlIiBpbiB0aGUgZmVhdHVyZSBwYXJlbnRNYXAgd2lsbCBiZSBhIGR1cGxpY2F0ZSB3aGljaCB3aWxsCisJCQkvLyBjYXVzZSBwcm9ibGVtcyBkdXJpbmcgcGFyc2luZy4KKwkJCS8vIFNlZSBhbHNvIGdldFhTSVR5cGUoKQorCQkJRU9iamVjdCBjaGlsZE9iamVjdCA9IG9iamVjdHMucGVla0VPYmplY3QoKTsKKwkJCWlmIChjaGlsZE9iamVjdCE9bnVsbCkgeworCQkJCXRyeSB7CisJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBhbnlBdHRyaWJ1dGUgPSBjaGlsZE9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoQnBtbjJQYWNrYWdlLkJBU0VfRUxFTUVOVF9fQU5ZX0FUVFJJQlVURSk7CisJCQkJCWlmIChhbnlBdHRyaWJ1dGUhPW51bGwpIHsKKwkJCQkJCUxpc3Q8QmFzaWNGZWF0dXJlTWFwLkVudHJ5PiBhbnlNYXAgPSAoTGlzdDxCYXNpY0ZlYXR1cmVNYXAuRW50cnk+KWNoaWxkT2JqZWN0LmVHZXQoYW55QXR0cmlidXRlKTsKKwkJCQkJCWlmIChhbnlNYXAhPW51bGwpIHsKKwkJCQkJCQlMaXN0PEJhc2ljRmVhdHVyZU1hcC5FbnRyeT4gcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8QmFzaWNGZWF0dXJlTWFwLkVudHJ5PigpOworCQkJCQkJCWZvciAoQmFzaWNGZWF0dXJlTWFwLkVudHJ5IGZlIDogYW55TWFwKSB7CisJCQkJCQkJCWlmIChmZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKKwkJCQkJCQkJCUVBdHRyaWJ1dGVJbXBsIGEgPSAoRUF0dHJpYnV0ZUltcGwpZmUuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7CisJCQkJCQkJCQlTdHJpbmcgbiA9IGEuZ2V0TmFtZSgpOworCQkJCQkJCQkJU3RyaW5nIG5zID0gYS5nZXRFeHRlbmRlZE1ldGFEYXRhKCkuZ2V0TmFtZXNwYWNlKCk7CisJCQkJCQkJCQlpZiAoVFlQRS5lcXVhbHMobikgJiYgWFNJX1VSSS5lcXVhbHMobnMpKSB7CisJCQkJCQkJCQkJcmVtb3ZlZC5hZGQoZmUpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmIChyZW1vdmVkLnNpemUoKT4wKQorCQkJCQkJCQlhbnlNYXAucmVtb3ZlQWxsKHJlbW92ZWQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0WFNJVHlwZSgpIHsKKwkJCWlmIChpc05hbWVzcGFjZUF3YXJlKQorCQkJCXJldHVybiBhdHRyaWJzLmdldFZhbHVlKEV4dGVuZGVkTWV0YURhdGEuWFNJX1VSSSwKKwkJCQkJCVhNTFJlc291cmNlLlRZUEUpOworCisJCQkvLyBJZiBhbiBwYXJhbWV0ZXIgc3BlY2lmaWVzIG11bHRpcGxlIHhzaTp0eXBlIGRhdGEgdHlwZXMsIHRoZSBsYXN0IG9uZSB3aW5zLgorCQkJLy8gTk9URTogd2UgbXVzdCBjaGVjayBmb3IgInR5cGUiIGluIGFueSBuYW1lc3BhY2Ugd2l0aCB0aGUgVVJJCisJCQkvLyAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQkJaW50IGxlbmd0aCA9IGF0dHJpYnMuZ2V0TGVuZ3RoKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisJCQkJYXR0cmlicy5nZXRRTmFtZShpKTsKKwkJCQlTdHJpbmcgbG9jYWxwYXJ0PSBhdHRyaWJzLmdldExvY2FsTmFtZShpKTsKKwkJCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKKwkJCQlpbnQgY2kgPSBsb2NhbHBhcnQubGFzdEluZGV4T2YoJzonKTsKKwkJCQlpZiAoY2k+MCkgeworCQkJCQlwcmVmaXggPSBsb2NhbHBhcnQuc3Vic3RyaW5nKDAsIGNpKTsgCisJCQkJCWxvY2FscGFydCA9IGxvY2FscGFydC5zdWJzdHJpbmcoY2krMSk7CisJCQkJfQorCQkJCWlmIChUWVBFLmVxdWFscyhsb2NhbHBhcnQpKSB7CisJCQkJCVN0cmluZyB1cmkgPSBoZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7CisJCQkJCWlmIChYU0lfVVJJLmVxdWFscyh1cmkpKSB7CisJCQkJCQl2YWx1ZSA9IGF0dHJpYnMuZ2V0VmFsdWUoaSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZUZyb21JZChFT2JqZWN0IG9iamVjdCwgRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBTdHJpbmcgaWRzKSB7CisJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2FsbEFjdGl2aXR5KSB7CisJCQkJLy8gdGhlIENhbGxlZEVsZW1lbnRSZWYgaW4gQ2FsbEFjdGl2aXR5IGlzIGp1c3QgYW4gSUQuIFRoaXMgbWVhbnMgd2UgbmVlZAorCQkJCS8vIHRvIGNyZWF0ZSBhIENhbGxhYmxlRWxlbWVudCB3aGljaCBpcyBzaW1wbHkgYSBwcm94eSwgbm90IGEgcmVhbCBvYmplY3QuCisJCQkJQ2FsbEFjdGl2aXR5IGNhID0gKENhbGxBY3Rpdml0eSlvYmplY3Q7CisJCQkJQ2FsbGFibGVFbGVtZW50IGNlID0gQnBtbjJNb2RlbGVyRmFjdG9yeS5jcmVhdGUoQ2FsbGFibGVFbGVtZW50LmNsYXNzKTsKKwkJCQkoKEludGVybmFsRU9iamVjdCljZSkuZVNldFByb3h5VVJJKFVSSS5jcmVhdGVVUkkoaWRzKSk7CisJCQkJY2Euc2V0Q2FsbGVkRWxlbWVudFJlZihjZSk7CisJCQl9CisJCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlcmZhY2UgJiYgZVJlZmVyZW5jZT09QnBtbjJQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlcmZhY2VfSW1wbGVtZW50YXRpb25SZWYoKSkgeworCQkJCS8vIHRoZSBJbnRlcmZhY2UuaW1wbGVtZW50YXRpb25SZWYgaXMgeWV0IGFnYWluIGp1c3QgYSBzdHJpbmcKKwkJCQlJbnRlcmZhY2UgaWZhY2UgPSAoSW50ZXJmYWNlKW9iamVjdDsKKwkJCQlpZmFjZS5zZXRJbXBsZW1lbnRhdGlvblJlZiggTW9kZWxVdGlsLmNyZWF0ZVN0cmluZ1dyYXBwZXIoaWRzKSApOworCQkJfQorCQkJZWxzZQorCQkJCXN1cGVyLnNldFZhbHVlRnJvbUlkKG9iamVjdCwgZVJlZmVyZW5jZSwgaWRzKTsKKwkJfQorICAgIH0KK30gLy9Nb2RlbFJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5ydW50aW1lLmpib3NzLmpicG01L3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3J1bnRpbWUvamJvc3MvamJwbTUvcHJvcGVydHkvSmJwbURlZmluaXRpb25zUHJvcGVydHlTZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvcnVudGltZS9qYm9zcy9qYnBtNS9wcm9wZXJ0eS9KYnBtRGVmaW5pdGlvbnNQcm9wZXJ0eVNlY3Rpb24uamF2YQppbmRleCA4YzNiNjRjLi44YTZkZDE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvcnVudGltZS9qYm9zcy9qYnBtNS9wcm9wZXJ0eS9KYnBtRGVmaW5pdGlvbnNQcm9wZXJ0eVNlY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvcnVudGltZS9qYm9zcy9qYnBtNS9wcm9wZXJ0eS9KYnBtRGVmaW5pdGlvbnNQcm9wZXJ0eVNlY3Rpb24uamF2YQpAQCAtMSwzNiArMSwxNDQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDExIFJlZCBIYXQsIEluYy4NCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKiBUaGlzIHByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQ0KLSAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwNCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqDQotICogQGF1dGhvciBCb2IgQnJvZHQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5ydW50aW1lLmpib3NzLmpicG01LnByb3BlcnR5Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdERldGFpbENvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5kaWFncmFtcy5EZWZpbml0aW9uc1Byb3BlcnR5U2VjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS50YXNrcy5UYXNrRGV0YWlsQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotDQotLyoqDQotICogQGF1dGhvciBCb2IgQnJvZHQNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYnBtRGVmaW5pdGlvbnNQcm9wZXJ0eVNlY3Rpb24gZXh0ZW5kcyBEZWZpbml0aW9uc1Byb3BlcnR5U2VjdGlvbiB7DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgQWJzdHJhY3REZXRhaWxDb21wb3NpdGUgY3JlYXRlU2VjdGlvblJvb3QoKSB7DQotCQlyZXR1cm4gbmV3IEpicG1EZWZpbml0aW9uc1Byb3BlcnR5Q29tcG9zaXRlKHRoaXMpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWJzdHJhY3REZXRhaWxDb21wb3NpdGUgY3JlYXRlU2VjdGlvblJvb3QoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlyZXR1cm4gbmV3IEpicG1EZWZpbml0aW9uc1Byb3BlcnR5Q29tcG9zaXRlKHBhcmVudCxzdHlsZSk7DQotCX0NCi19DQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBhdXRob3IgQm9iIEJyb2R0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIucnVudGltZS5qYm9zcy5qYnBtNS5wcm9wZXJ0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkJwbW4yUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5NZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLlByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3REZXRhaWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3RMaXN0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHREZXRhaWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuRGVmYXVsdExpc3RDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuTGlzdENvbXBvc2l0ZUNvbHVtblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLlByb3BlcnRpZXNDb21wb3NpdGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHREZXRhaWxDb21wb3NpdGUuQWJzdHJhY3RQcm9wZXJ0aWVzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5kYXRhLkl0ZW1Bd2FyZUVsZW1lbnREZXRhaWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5kYXRhLk1lc3NhZ2VEZXRhaWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5kYXRhLk1lc3NhZ2VMaXN0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkucHJvcGVydHkuZGlhZ3JhbXMuRGVmaW5pdGlvbnNQcm9wZXJ0eVNlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS50YXNrcy5UYXNrRGV0YWlsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEBhdXRob3IgQm9iIEJyb2R0CisgKgorICovCitwdWJsaWMgY2xhc3MgSmJwbURlZmluaXRpb25zUHJvcGVydHlTZWN0aW9uIGV4dGVuZHMgRGVmaW5pdGlvbnNQcm9wZXJ0eVNlY3Rpb24geworCXN0YXRpYyB7CisJCVByb3BlcnRpZXNDb21wb3NpdGVGYWN0b3J5LnJlZ2lzdGVyKE1lc3NhZ2UuY2xhc3MsIEpicG1NZXNzYWdlRGV0YWlsQ29tcG9zaXRlLmNsYXNzKTsKKwkJUHJvcGVydGllc0NvbXBvc2l0ZUZhY3RvcnkucmVnaXN0ZXIoTWVzc2FnZS5jbGFzcywgSmJwbU1lc3NhZ2VMaXN0Q29tcG9zaXRlLmNsYXNzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQWJzdHJhY3REZXRhaWxDb21wb3NpdGUgY3JlYXRlU2VjdGlvblJvb3QoKSB7CisJCXJldHVybiBuZXcgSmJwbURlZmluaXRpb25zUHJvcGVydHlDb21wb3NpdGUodGhpcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEFic3RyYWN0RGV0YWlsQ29tcG9zaXRlIGNyZWF0ZVNlY3Rpb25Sb290KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworCQlyZXR1cm4gbmV3IEpicG1EZWZpbml0aW9uc1Byb3BlcnR5Q29tcG9zaXRlKHBhcmVudCxzdHlsZSk7CisJfQorCXB1YmxpYyBjbGFzcyBKYnBtTWVzc2FnZURldGFpbENvbXBvc2l0ZSBleHRlbmRzIERlZmF1bHREZXRhaWxDb21wb3NpdGUgeworCisJCXByaXZhdGUgQWJzdHJhY3RQcm9wZXJ0aWVzUHJvdmlkZXIgcHJvcGVydGllc1Byb3ZpZGVyOworCisJCXB1YmxpYyBKYnBtTWVzc2FnZURldGFpbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBzZWN0aW9uCisJCSAqLworCQlwdWJsaWMgSmJwbU1lc3NhZ2VEZXRhaWxDb21wb3NpdGUoQWJzdHJhY3RCcG1uMlByb3BlcnR5U2VjdGlvbiBzZWN0aW9uKSB7CisJCQlzdXBlcihzZWN0aW9uKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWJzdHJhY3RQcm9wZXJ0aWVzUHJvdmlkZXIgZ2V0UHJvcGVydGllc1Byb3ZpZGVyKEVPYmplY3Qgb2JqZWN0KSB7CisJCQlpZiAocHJvcGVydGllc1Byb3ZpZGVyPT1udWxsKSB7CisJCQkJcHJvcGVydGllc1Byb3ZpZGVyID0gbmV3IEFic3RyYWN0UHJvcGVydGllc1Byb3ZpZGVyKG9iamVjdCkgeworCQkJCQlTdHJpbmdbXSBwcm9wZXJ0aWVzID0gbmV3IFN0cmluZ1tdIHsKKwkJCQkJCQkiaWQiLAorCQkJCQkJCSJpdGVtUmVmIgorCQkJCQl9OworCQkJCQkKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0aWVzKCkgeworCQkJCQkJcmV0dXJuIHByb3BlcnRpZXM7IAorCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJCXJldHVybiBwcm9wZXJ0aWVzUHJvdmlkZXI7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBiaW5kQXR0cmlidXRlKENvbXBvc2l0ZSBwYXJlbnQsIEVPYmplY3Qgb2JqZWN0LCBFQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIGxhYmVsKSB7CisJCQlpZiAoImlkIi5lcXVhbHMoYXR0cmlidXRlLmdldE5hbWUoKSkpCisJCQkJbGFiZWwgPSAiTmFtZSI7CisJCQlzdXBlci5iaW5kQXR0cmlidXRlKHBhcmVudCwgb2JqZWN0LCBhdHRyaWJ1dGUsIGxhYmVsKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIGlzTW9kZWxPYmplY3RFbmFibGVkKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBmZWF0dXJlTmFtZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJCisJcHVibGljIGNsYXNzIEpicG1NZXNzYWdlTGlzdENvbXBvc2l0ZSBleHRlbmRzIERlZmF1bHRMaXN0Q29tcG9zaXRlIHsKKworCQlwdWJsaWMgSmJwbU1lc3NhZ2VMaXN0Q29tcG9zaXRlKEFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24gc2VjdGlvbiwgaW50IHN0eWxlKSB7CisJCQlzdXBlcihzZWN0aW9uLCBzdHlsZSk7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwkJfQorCisJCXB1YmxpYyBKYnBtTWVzc2FnZUxpc3RDb21wb3NpdGUoQWJzdHJhY3RCcG1uMlByb3BlcnR5U2VjdGlvbiBzZWN0aW9uKSB7CisJCQlzdXBlcihzZWN0aW9uLAorCQkJCQlBYnN0cmFjdExpc3RDb21wb3NpdGUuU0hPV19ERVRBSUxTIHwKKwkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLkFERF9CVVRUT04gfAorCQkJCQlBYnN0cmFjdExpc3RDb21wb3NpdGUuTU9WRV9CVVRUT05TIHwKKwkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLkRFTEVURV9CVVRUT04pOworCQl9CisKKwkJcHVibGljIEpicG1NZXNzYWdlTGlzdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJCXN1cGVyKHBhcmVudCwKKwkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLlNIT1dfREVUQUlMUyB8CisJCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5BRERfQlVUVE9OIHwKKwkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLk1PVkVfQlVUVE9OUyB8CisJCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5ERUxFVEVfQlVUVE9OKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBMaXN0Q29tcG9zaXRlQ29sdW1uUHJvdmlkZXIgZ2V0Q29sdW1uUHJvdmlkZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlpZiAoY29sdW1uUHJvdmlkZXI9PW51bGwpIHsKKwkJCQljb2x1bW5Qcm92aWRlciA9IG5ldyBMaXN0Q29tcG9zaXRlQ29sdW1uUHJvdmlkZXIodGhpcywgZmFsc2UpOworCQkJCVRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKG9iamVjdCxCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VFbGVtZW50X0lkKCkpOworCQkJCXRjLnNldEhlYWRlclRleHQoIk5hbWUiKTsgCisJCQkJY29sdW1uUHJvdmlkZXIuYWRkKHRjKTsKKwkJCQljb2x1bW5Qcm92aWRlci5hZGQobmV3IFRhYmxlQ29sdW1uKG9iamVjdCxCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VfSXRlbVJlZigpKSk7CisJCQl9CisJCQlyZXR1cm4gY29sdW1uUHJvdmlkZXI7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIGJvb2xlYW4gaXNNb2RlbE9iamVjdEVuYWJsZWQoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5ydW50aW1lLmpib3NzLmpicG01L3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3J1bnRpbWUvamJvc3MvamJwbTUvcHJvcGVydHkvSmJwbURlc2NyaXB0aW9uUHJvcGVydHlTZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvcnVudGltZS9qYm9zcy9qYnBtNS9wcm9wZXJ0eS9KYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eVNlY3Rpb24uamF2YQppbmRleCBmNWRmZTcxLi41YzIzZjEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvcnVudGltZS9qYm9zcy9qYnBtNS9wcm9wZXJ0eS9KYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eVNlY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnJ1bnRpbWUuamJvc3MuamJwbTUvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvcnVudGltZS9qYm9zcy9qYnBtNS9wcm9wZXJ0eS9KYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eVNlY3Rpb24uamF2YQpAQCAtMSwxMDEgKzEsMTAxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAxMSBSZWQgSGF0LCBJbmMuDQotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICogVGhpcyBwcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUNCi0gKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sDQotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIFJlZCBIYXQsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKg0KLSAqIEBhdXRob3IgQm9iIEJyb2R0DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIucnVudGltZS5qYm9zcy5qYnBtNS5wcm9wZXJ0eTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQmFzZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLlBhcnRpY2lwYW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5Qcm9jZXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5kaS5CUE1ORGlhZ3JhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3RCcG1uMlByb3BlcnR5U2VjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3REZXRhaWxDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkucHJvcGVydHkuRGVzY3JpcHRpb25Qcm9wZXJ0eVNlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkucHJvcGVydHkudGFza3MuVGFza0RldGFpbENvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIGFuIGVtcHR5IHRhYiBzZWN0aW9uIHdoaWNoIHNpbXBseSBleGlzdHMgdG8gaGlkZSB0aGUgIkJhc2ljIiB0YWINCi0gKiBkZWZpbmVkIHRoZSBlZGl0b3IgVUkgcGx1Z2luLg0KLSAqIA0KLSAqIEBhdXRob3IgQm9iIEJyb2R0DQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmJwbURlc2NyaXB0aW9uUHJvcGVydHlTZWN0aW9uIGV4dGVuZHMgRGVzY3JpcHRpb25Qcm9wZXJ0eVNlY3Rpb24gew0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KLQkJcmV0dXJuIGdldEJ1c2luZXNzT2JqZWN0Rm9yU2VsZWN0aW9uKHNlbGVjdGlvbikgIT0gbnVsbDsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEFic3RyYWN0RGV0YWlsQ29tcG9zaXRlIGNyZWF0ZVNlY3Rpb25Sb290KCkgew0KLQkJcmV0dXJuIG5ldyBKYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSh0aGlzKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFic3RyYWN0RGV0YWlsQ29tcG9zaXRlIGNyZWF0ZVNlY3Rpb25Sb290KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLQkJcmV0dXJuIG5ldyBKYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eUNvbXBvc2l0ZShwYXJlbnQsc3R5bGUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSmJwbURlc2NyaXB0aW9uUHJvcGVydHlTZWN0aW9uKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCXB1YmxpYyBjbGFzcyBKYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIERlc2NyaXB0aW9uUHJvcGVydHlDb21wb3NpdGUgew0KLQkJDQotCQlwdWJsaWMgSmJwbURlc2NyaXB0aW9uUHJvcGVydHlDb21wb3NpdGUoDQotCQkJCUFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24gc2VjdGlvbikgew0KLQkJCXN1cGVyKHNlY3Rpb24pOw0KLQkJfQ0KLQ0KLQkJcHVibGljIEpicG1EZXNjcmlwdGlvblByb3BlcnR5Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLQkJCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgdm9pZCBjcmVhdGVCaW5kaW5ncyhFT2JqZWN0IGJlKSB7DQotCQkJLy8gZm9yIEJQTU5EaWFncmFtIG9iamVjdHMsIHBpY2sgb3V0IHRoZSBQcm9jZXNzIGFuZCByZW5kZXIgdGhlIFByb2Nlc3MgYXR0cmlidXRlcw0KLQkJCVByb2Nlc3MgcHJvY2VzcyA9IG51bGw7DQotCQkJaWYgKGJlIGluc3RhbmNlb2YgUGFydGljaXBhbnQpIHsNCi0JCQkJcHJvY2VzcyA9ICgoUGFydGljaXBhbnQpIGJlKS5nZXRQcm9jZXNzUmVmKCk7DQotCQkJfSBlbHNlIGlmIChiZSBpbnN0YW5jZW9mIEJQTU5EaWFncmFtKSB7DQotCQkJCUJhc2VFbGVtZW50IGJwbW5FbGVtZW50ID0gKChCUE1ORGlhZ3JhbSliZSkuZ2V0UGxhbmUoKS5nZXRCcG1uRWxlbWVudCgpOw0KLQkJCQlpZiAoYnBtbkVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKQ0KLQkJCQkJcHJvY2VzcyA9IChQcm9jZXNzKWJwbW5FbGVtZW50Ow0KLQkJCX0NCi0JCQkNCi0JCQlpZiAocHJvY2Vzcz09bnVsbCkgew0KLQkJCQkvLyBkaXNwbGF5IHRoZSBkZWZhdWx0IERlc2NyaXB0aW9uIHRhYg0KLQkJCQlzdXBlci5jcmVhdGVCaW5kaW5ncyhiZSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQkvLyBjcmVhdGUgb3VyIG93biBmb3IgUHJvY2Vzcw0KLQkJCQliaW5kRGVzY3JpcHRpb24oYmUpOw0KLQkJCQkNCi0JCQkJYmluZEF0dHJpYnV0ZShwcm9jZXNzLCAiaWQiKTsNCi0JCQkJYmluZEF0dHJpYnV0ZShwcm9jZXNzLCAibmFtZSIpOw0KLQkJCQliaW5kQXR0cmlidXRlKHByb2Nlc3MsICJhbnlBdHRyaWJ1dGUiKTsNCi0JCQkJYmluZEF0dHJpYnV0ZShwcm9jZXNzLCAicHJvY2Vzc1R5cGUiKTsNCi0JCQkJYmluZEF0dHJpYnV0ZShwcm9jZXNzLCAiaXNFeGVjdXRhYmxlIik7DQotCQkJCWJpbmRBdHRyaWJ1dGUocHJvY2VzcywgImlzQ2xvc2VkIik7DQotLy8JCQkJYmluZExpc3QocHJvY2VzcywgInByb3BlcnRpZXMiKTsgLy8gdGhpcyBoYXMgbW92ZWQgdG8gSmJwbURhdGFJdGVtc0RldGFpbENvbXBvc2l0ZQ0KLQkJCQliaW5kTGlzdChwcm9jZXNzLCAibGFuZVNldHMiKTsNCi0JCQl9DQotCQl9DQotDQotCX0NCi19DQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBhdXRob3IgQm9iIEJyb2R0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIucnVudGltZS5qYm9zcy5qYnBtNS5wcm9wZXJ0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkJhc2VFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLlBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLlByb2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuZGkuQlBNTkRpYWdyYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3RCcG1uMlByb3BlcnR5U2VjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdERldGFpbENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpLnByb3BlcnR5LkRlc2NyaXB0aW9uUHJvcGVydHlTZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkucHJvcGVydHkudGFza3MuVGFza0RldGFpbENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworCisvKioKKyAqIFRoaXMgaXMgYW4gZW1wdHkgdGFiIHNlY3Rpb24gd2hpY2ggc2ltcGx5IGV4aXN0cyB0byBoaWRlIHRoZSAiQmFzaWMiIHRhYgorICogZGVmaW5lZCB0aGUgZWRpdG9yIFVJIHBsdWdpbi4KKyAqIAorICogQGF1dGhvciBCb2IgQnJvZHQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eVNlY3Rpb24gZXh0ZW5kcyBEZXNjcmlwdGlvblByb3BlcnR5U2VjdGlvbiB7CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXJldHVybiBnZXRCdXNpbmVzc09iamVjdEZvclNlbGVjdGlvbihzZWxlY3Rpb24pICE9IG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFic3RyYWN0RGV0YWlsQ29tcG9zaXRlIGNyZWF0ZVNlY3Rpb25Sb290KCkgeworCQlyZXR1cm4gbmV3IEpicG1EZXNjcmlwdGlvblByb3BlcnR5Q29tcG9zaXRlKHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBYnN0cmFjdERldGFpbENvbXBvc2l0ZSBjcmVhdGVTZWN0aW9uUm9vdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJcmV0dXJuIG5ldyBKYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eUNvbXBvc2l0ZShwYXJlbnQsc3R5bGUpOworCX0KKwkKKwlwdWJsaWMgSmJwbURlc2NyaXB0aW9uUHJvcGVydHlTZWN0aW9uKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgY2xhc3MgSmJwbURlc2NyaXB0aW9uUHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBEZXNjcmlwdGlvblByb3BlcnR5Q29tcG9zaXRlIHsKKwkJCisJCXB1YmxpYyBKYnBtRGVzY3JpcHRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSgKKwkJCQlBYnN0cmFjdEJwbW4yUHJvcGVydHlTZWN0aW9uIHNlY3Rpb24pIHsKKwkJCXN1cGVyKHNlY3Rpb24pOworCQl9CisKKwkJcHVibGljIEpicG1EZXNjcmlwdGlvblByb3BlcnR5Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworCQkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY3JlYXRlQmluZGluZ3MoRU9iamVjdCBiZSkgeworCQkJLy8gZm9yIEJQTU5EaWFncmFtIG9iamVjdHMsIHBpY2sgb3V0IHRoZSBQcm9jZXNzIGFuZCByZW5kZXIgdGhlIFByb2Nlc3MgYXR0cmlidXRlcworCQkJUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKKwkJCWlmIChiZSBpbnN0YW5jZW9mIFBhcnRpY2lwYW50KSB7CisJCQkJcHJvY2VzcyA9ICgoUGFydGljaXBhbnQpIGJlKS5nZXRQcm9jZXNzUmVmKCk7CisJCQl9IGVsc2UgaWYgKGJlIGluc3RhbmNlb2YgQlBNTkRpYWdyYW0pIHsKKwkJCQlCYXNlRWxlbWVudCBicG1uRWxlbWVudCA9ICgoQlBNTkRpYWdyYW0pYmUpLmdldFBsYW5lKCkuZ2V0QnBtbkVsZW1lbnQoKTsKKwkJCQlpZiAoYnBtbkVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKQorCQkJCQlwcm9jZXNzID0gKFByb2Nlc3MpYnBtbkVsZW1lbnQ7CisJCQl9CisJCQkKKwkJCWlmIChwcm9jZXNzPT1udWxsKSB7CisJCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdCBEZXNjcmlwdGlvbiB0YWIKKwkJCQlzdXBlci5jcmVhdGVCaW5kaW5ncyhiZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyBjcmVhdGUgb3VyIG93biBmb3IgUHJvY2VzcworCQkJCWJpbmREZXNjcmlwdGlvbihiZSk7CisJCQkJCisJCQkJYmluZEF0dHJpYnV0ZShwcm9jZXNzLCAiaWQiKTsKKwkJCQliaW5kQXR0cmlidXRlKHByb2Nlc3MsICJuYW1lIik7CisJCQkJYmluZEF0dHJpYnV0ZShwcm9jZXNzLCAiYW55QXR0cmlidXRlIik7CisJCQkJYmluZEF0dHJpYnV0ZShwcm9jZXNzLCAicHJvY2Vzc1R5cGUiKTsKKwkJCQliaW5kQXR0cmlidXRlKHByb2Nlc3MsICJpc0V4ZWN1dGFibGUiKTsKKwkJCQliaW5kQXR0cmlidXRlKHByb2Nlc3MsICJpc0Nsb3NlZCIpOworLy8JCQkJYmluZExpc3QocHJvY2VzcywgInByb3BlcnRpZXMiKTsgLy8gdGhpcyBoYXMgbW92ZWQgdG8gSmJwbURhdGFJdGVtc0RldGFpbENvbXBvc2l0ZQorLy8JCQkJYmluZExpc3QocHJvY2VzcywgImxhbmVTZXRzIik7IC8vIGRvbid0IG5lZWQgdGhpcworCQkJfQorCQl9CisKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL2FkYXB0ZXJzL3Byb3BlcnRpZXMvSW50ZXJmYWNlUHJvcGVydGllc0FkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvYWRhcHRlcnMvcHJvcGVydGllcy9JbnRlcmZhY2VQcm9wZXJ0aWVzQWRhcHRlci5qYXZhCmluZGV4IDMzOWMwMWQuLjc3Zjg4NzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvYWRhcHRlcnMvcHJvcGVydGllcy9JbnRlcmZhY2VQcm9wZXJ0aWVzQWRhcHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvYWRhcHRlcnMvcHJvcGVydGllcy9JbnRlcmZhY2VQcm9wZXJ0aWVzQWRhcHRlci5qYXZhCkBAIC00OSw2ICs0OSw3IEBACiAJCQkJCQlTdHJpbmcgdGV4dCA9IE1vZGVsVXRpbC5nZXRTdHJpbmdXcmFwcGVyVmFsdWUoIGlmYWNlLmdldEltcGxlbWVudGF0aW9uUmVmKCkgKTsgLy8gKyB0eXBlOwogCQkJCQkJaWYgKHRleHQ9PW51bGwpCiAJCQkJCQkJcmV0dXJuIE1vZGVsVXRpbC5nZXREaXNwbGF5TmFtZShpZmFjZS5nZXRJbXBsZW1lbnRhdGlvblJlZigpKTsKKwkJCQkJCXJldHVybiB0ZXh0OwogCQkJCQl9CiAJCQkJCXJldHVybiAiIjsKIAkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL2FkYXB0ZXJzL3Byb3BlcnRpZXMvTWVzc2FnZVByb3BlcnRpZXNBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL2FkYXB0ZXJzL3Byb3BlcnRpZXMvTWVzc2FnZVByb3BlcnRpZXNBZGFwdGVyLmphdmEKaW5kZXggMmY2NmVjMS4uNWI1MWIwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9hZGFwdGVycy9wcm9wZXJ0aWVzL01lc3NhZ2VQcm9wZXJ0aWVzQWRhcHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvYWRhcHRlcnMvcHJvcGVydGllcy9NZXNzYWdlUHJvcGVydGllc0FkYXB0ZXIuamF2YQpAQCAtMSw1MCArMSw3NSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgUmVkIEhhdCwgSW5jLg0KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQotICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLA0KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiBSZWQgSGF0LCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEJvYiBCcm9kdA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpLmFkYXB0ZXJzLnByb3BlcnRpZXM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkJwbW4yUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuRXJyb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLk1lc3NhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5hZGFwdGVycy5FeHRlbmRlZFByb3BlcnRpZXNBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUuYWRhcHRlcnMuT2JqZWN0RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5mZWF0dXJlcy5jaG9yZW9ncmFwaHkuQ2hvcmVvZ3JhcGh5VXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQotDQotLyoqDQotICogQGF1dGhvciBHYXJ5IEJyb3duDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVByb3BlcnRpZXNBZGFwdGVyIGV4dGVuZHMgUm9vdEVsZW1lbnRQcm9wZXJ0aWVzQWRhcHRlcjxNZXNzYWdlPiB7DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkNCi0JICogQHBhcmFtIG9iamVjdA0KLQkgKi8NCi0JcHVibGljIE1lc3NhZ2VQcm9wZXJ0aWVzQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgTWVzc2FnZSBvYmplY3QpIHsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QpOw0KLQkJDQotICAgIAlzZXRPYmplY3REZXNjcmlwdG9yKG5ldyBSb290RWxlbWVudE9iamVjdERlc2NyaXB0b3I8TWVzc2FnZT4oYWRhcHRlckZhY3RvcnksIG9iamVjdCkgew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoT2JqZWN0IGNvbnRleHQpIHsNCi0JCQkJZmluYWwgTWVzc2FnZSBtZXNnID0gYWRvcHQoY29udGV4dCk7DQotCQkJCVN0cmluZyB0ZXh0ID0gQ2hvcmVvZ3JhcGh5VXRpbC5nZXRNZXNzYWdlTmFtZShtZXNnKTsNCi0JCQkJcmV0dXJuIHRleHQ7DQotCQkJfQ0KLSAgICAJfSk7DQotCX0NCi0NCi19DQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBhdXRob3IgQm9iIEJyb2R0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkuYWRhcHRlcnMucHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkJwbW4yUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5FcnJvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5JdGVtQXdhcmVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkl0ZW1EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLmFkYXB0ZXJzLkFkYXB0ZXJVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5hZGFwdGVycy5FeHRlbmRlZFByb3BlcnRpZXNBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5hZGFwdGVycy5GZWF0dXJlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUuYWRhcHRlcnMuT2JqZWN0RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpLmZlYXR1cmVzLmNob3Jlb2dyYXBoeS5DaG9yZW9ncmFwaHlVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCisvKioKKyAqIEBhdXRob3IgR2FyeSBCcm93bgorICoKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VQcm9wZXJ0aWVzQWRhcHRlciBleHRlbmRzIFJvb3RFbGVtZW50UHJvcGVydGllc0FkYXB0ZXI8TWVzc2FnZT4geworCisJLyoqCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogQHBhcmFtIG9iamVjdAorCSAqLworCXB1YmxpYyBNZXNzYWdlUHJvcGVydGllc0FkYXB0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE1lc3NhZ2Ugb2JqZWN0KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QpOworCisJCUVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYgPSBCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VfSXRlbVJlZigpOworICAgIAkKKyAgICAJc2V0RmVhdHVyZURlc2NyaXB0b3IocmVmLCBuZXcgRmVhdHVyZURlc2NyaXB0b3I8TWVzc2FnZT4oYWRhcHRlckZhY3RvcnksIG9iamVjdCwgcmVmKSB7CisKKyAgICAJCUBPdmVycmlkZQorICAgIAkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZShPYmplY3QgY29udGV4dCkgeworICAgIAkJCUVPYmplY3Qgb2JqZWN0ID0gdGhpcy5vYmplY3Q7CisgICAgCQkJSXRlbURlZmluaXRpb24gaXRlbURlZmluaXRpb24gPSBudWxsOworICAgIAkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlKSB7CisgICAgCQkJCWl0ZW1EZWZpbml0aW9uID0gKEl0ZW1EZWZpbml0aW9uKSBvYmplY3QuZUdldChmZWF0dXJlKTsKKyAgICAJCQl9CisgICAgCQkJaWYgKGl0ZW1EZWZpbml0aW9uIT1udWxsKSB7CisgICAgCQkJCUV4dGVuZGVkUHJvcGVydGllc0FkYXB0ZXI8SXRlbURlZmluaXRpb24+IGFkYXB0ZXIgPQorICAgIAkJCQkJCShFeHRlbmRlZFByb3BlcnRpZXNBZGFwdGVyPEl0ZW1EZWZpbml0aW9uPikgQWRhcHRlclV0aWwuYWRhcHQoaXRlbURlZmluaXRpb24sIEV4dGVuZGVkUHJvcGVydGllc0FkYXB0ZXIuY2xhc3MpOworICAgIAkJCQlyZXR1cm4gYWRhcHRlci5nZXRGZWF0dXJlRGVzY3JpcHRvcihCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZW1EZWZpbml0aW9uX1N0cnVjdHVyZVJlZigpKS5nZXREaXNwbGF5TmFtZShpdGVtRGVmaW5pdGlvbik7CisgICAgCQkJfQorICAgIAkJCXJldHVybiBzdXBlci5nZXREaXNwbGF5TmFtZShjb250ZXh0KTsKKyAgICAJCX0KKyAgICAJCQorICAgIAl9KTsKKworICAgIAlzZXRPYmplY3REZXNjcmlwdG9yKG5ldyBSb290RWxlbWVudE9iamVjdERlc2NyaXB0b3I8TWVzc2FnZT4oYWRhcHRlckZhY3RvcnksIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKE9iamVjdCBjb250ZXh0KSB7CisJCQkJZmluYWwgTWVzc2FnZSBtZXNnID0gYWRvcHQoY29udGV4dCk7CisJCQkJU3RyaW5nIHRleHQgPSBDaG9yZW9ncmFwaHlVdGlsLmdldE1lc3NhZ2VOYW1lKG1lc2cpOworCQkJCXJldHVybiB0ZXh0OworCQkJfQorICAgIAl9KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZGF0YS9JbnRlcmZhY2VQcm9wZXJ0eVNlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZGF0YS9JbnRlcmZhY2VQcm9wZXJ0eVNlY3Rpb24uamF2YQppbmRleCA0NDc5MzRkLi5jYmNjNTIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL3Byb3BlcnR5L2RhdGEvSW50ZXJmYWNlUHJvcGVydHlTZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9wcm9wZXJ0eS9kYXRhL0ludGVyZmFjZVByb3BlcnR5U2VjdGlvbi5qYXZhCkBAIC0xLDI3MiArMSwyODQgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5kYXRhOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQmFzZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkJwbW4yUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQ2FsbGFibGVFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5EZWZpbml0aW9uczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuSW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5QYXJ0aWNpcGFudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuUHJvY2VzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuZGkuQlBNTkRpYWdyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0RGV0YWlsQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdExpc3RDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHREZXRhaWxDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHRMaXN0Q29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5EZWZhdWx0UHJvcGVydHlTZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5Qcm9wZXJ0aWVzQ29tcG9zaXRlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1vZGVsLkJwbW4yTW9kZWxlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS51dGlscy5Nb2RlbFV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbnRlcmZhY2VQcm9wZXJ0eVNlY3Rpb24gZXh0ZW5kcyBEZWZhdWx0UHJvcGVydHlTZWN0aW9uIHsNCi0NCi0Jc3RhdGljIHsNCi0JCVByb3BlcnRpZXNDb21wb3NpdGVGYWN0b3J5LnJlZ2lzdGVyKEludGVyZmFjZS5jbGFzcywgSW50ZXJmYWNlRGV0YWlsQ29tcG9zaXRlLmNsYXNzKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEFic3RyYWN0RGV0YWlsQ29tcG9zaXRlIGNyZWF0ZVNlY3Rpb25Sb290KCkgew0KLQkJcmV0dXJuIG5ldyBJbnRlcmZhY2VTZWN0aW9uUm9vdCh0aGlzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW50ZXJmYWNlUHJvcGVydHlTZWN0aW9uKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KFBpY3RvZ3JhbUVsZW1lbnQgcGUpIHsNCi0JCUVPYmplY3QgYm8gPSBzdXBlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOw0KLQkJaWYgKGJvIGluc3RhbmNlb2YgUGFydGljaXBhbnQpIHsNCi0JCQlyZXR1cm4gYm87DQotCQl9IGVsc2UgaWYgKGJvIGluc3RhbmNlb2YgQlBNTkRpYWdyYW0pIHsNCi0JCQlCYXNlRWxlbWVudCBiZSA9ICgoQlBNTkRpYWdyYW0pYm8pLmdldFBsYW5lKCkuZ2V0QnBtbkVsZW1lbnQoKTsNCi0JCQlpZiAoYmUgaW5zdGFuY2VvZiBQcm9jZXNzKQ0KLQkJCQlyZXR1cm4gYmU7DQotCQl9IGVsc2UgaWYgKGJvIGluc3RhbmNlb2YgQ2FsbGFibGVFbGVtZW50KSB7DQotCQkJcmV0dXJuIGJvOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIGNsYXNzIEludGVyZmFjZVNlY3Rpb25Sb290IGV4dGVuZHMgRGVmYXVsdERldGFpbENvbXBvc2l0ZSB7DQotDQotCQlEZWZpbmVkSW50ZXJmYWNlTGlzdENvbXBvc2l0ZSBkZWZpbmVkSW50ZXJmYWNlc1RhYmxlOw0KLQkJUHJvdmlkZWRJbnRlcmZhY2VMaXN0Q29tcG9zaXRlIHByb3ZpZGVkSW50ZXJmYWNlc1RhYmxlOw0KLQkJDQotCQkvKioNCi0JCSAqIEBwYXJhbSBwYXJlbnQNCi0JCSAqIEBwYXJhbSBzdHlsZQ0KLQkJICovDQotCQlwdWJsaWMgSW50ZXJmYWNlU2VjdGlvblJvb3QoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQkJc3VwZXIocGFyZW50LCBzdHlsZSk7DQotCQl9DQotDQotCQkvKioNCi0JCSAqIEBwYXJhbSBzZWN0aW9uDQotCQkgKi8NCi0JCXB1YmxpYyBJbnRlcmZhY2VTZWN0aW9uUm9vdChBYnN0cmFjdEJwbW4yUHJvcGVydHlTZWN0aW9uIHNlY3Rpb24pIHsNCi0JCQlzdXBlcihzZWN0aW9uKTsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIHZvaWQgY2xlYW5CaW5kaW5ncygpIHsNCi0JCQlzdXBlci5jbGVhbkJpbmRpbmdzKCk7DQotCQkJZGVmaW5lZEludGVyZmFjZXNUYWJsZSA9IG51bGw7DQotCQkJcHJvdmlkZWRJbnRlcmZhY2VzVGFibGUgPSBudWxsOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgdm9pZCBjcmVhdGVCaW5kaW5ncyhFT2JqZWN0IGJlKSB7DQotCQkJZGVmaW5lZEludGVyZmFjZXNUYWJsZSA9IG5ldyBEZWZpbmVkSW50ZXJmYWNlTGlzdENvbXBvc2l0ZSh0aGlzKTsNCi0JCQlkZWZpbmVkSW50ZXJmYWNlc1RhYmxlLmJpbmRMaXN0KGJlKTsNCi0NCi0JCQlpZiAoYmUgaW5zdGFuY2VvZiBQYXJ0aWNpcGFudCkgew0KLQkJCQlwcm92aWRlZEludGVyZmFjZXNUYWJsZSA9IG5ldyBQcm92aWRlZEludGVyZmFjZUxpc3RDb21wb3NpdGUodGhpcyk7DQotCQkJCXByb3ZpZGVkSW50ZXJmYWNlc1RhYmxlLmJpbmRMaXN0KGJlLCBnZXRGZWF0dXJlKGJlLCAiaW50ZXJmYWNlUmVmcyIpKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoYmUgaW5zdGFuY2VvZiBDYWxsYWJsZUVsZW1lbnQpIHsNCi0JCQkJQ2FsbGFibGVFbGVtZW50IGNlID0gKENhbGxhYmxlRWxlbWVudCliZTsNCi0JCQkJcHJvdmlkZWRJbnRlcmZhY2VzVGFibGUgPSBuZXcgUHJvdmlkZWRJbnRlcmZhY2VMaXN0Q29tcG9zaXRlKHRoaXMpOw0KLQkJCQlwcm92aWRlZEludGVyZmFjZXNUYWJsZS5iaW5kTGlzdChiZSwgZ2V0RmVhdHVyZShiZSwgInN1cHBvcnRlZEludGVyZmFjZVJlZnMiKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgY2xhc3MgRGVmaW5lZEludGVyZmFjZUxpc3RDb21wb3NpdGUgZXh0ZW5kcyBEZWZhdWx0TGlzdENvbXBvc2l0ZSB7DQotCQkNCi0JCS8qKg0KLQkJICogQHBhcmFtIHNlY3Rpb24NCi0JCSAqIEBwYXJhbSBzdHlsZQ0KLQkJICovDQotCQlwdWJsaWMgRGVmaW5lZEludGVyZmFjZUxpc3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJCXN1cGVyKHBhcmVudCwNCi0JCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5TSE9XX0RFVEFJTFMgfA0KLQkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLkFERF9CVVRUT04gfA0KLQkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLk1PVkVfQlVUVE9OUyB8DQotCQkJCQlBYnN0cmFjdExpc3RDb21wb3NpdGUuREVMRVRFX0JVVFRPTik7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBFQ2xhc3MgZ2V0TGlzdEl0ZW1DbGFzcyhFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCQlyZXR1cm4gbGlzdEl0ZW1DbGFzcyA9IEJwbW4yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZXJmYWNlKCk7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBiaW5kTGlzdChFT2JqZWN0IHRoZW9iamVjdCkgew0KLQkJCURlZmluaXRpb25zIGRlZnMgPSBNb2RlbFV0aWwuZ2V0RGVmaW5pdGlvbnModGhlb2JqZWN0KTsNCi0JCQlzdXBlci5iaW5kTGlzdChkZWZzLCBCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25zX1Jvb3RFbGVtZW50cygpKTsNCi0JCQlzZXRUaXRsZSgiQWxsIERlZmluZWQgSW50ZXJmYWNlcyIpOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgRU9iamVjdCBhZGRMaXN0SXRlbShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCQlJbnRlcmZhY2UgaWZhY2UgPSAoSW50ZXJmYWNlKSBNb2RlbFV0aWwuY3JlYXRlT2JqZWN0KG9iamVjdC5lUmVzb3VyY2UoKSwgUEFDS0FHRS5nZXRJbnRlcmZhY2UoKSk7DQotCQkJDQotCQkJRUxpc3Q8RU9iamVjdD4gbGlzdCA9IChFTGlzdDxFT2JqZWN0PilvYmplY3QuZUdldChmZWF0dXJlKTsNCi0JCQlsaXN0LmFkZChpZmFjZSk7DQotCQkJcmV0dXJuIGlmYWNlOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgY2xhc3MgUHJvdmlkZWRJbnRlcmZhY2VMaXN0Q29tcG9zaXRlIGV4dGVuZHMgRGVmYXVsdExpc3RDb21wb3NpdGUgew0KLQkJDQotCQkvKioNCi0JCSAqIEBwYXJhbSBzZWN0aW9uDQotCQkgKiBAcGFyYW0gc3R5bGUNCi0JCSAqLw0KLQkJcHVibGljIFByb3ZpZGVkSW50ZXJmYWNlTGlzdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7DQotCQkJc3VwZXIocGFyZW50LA0KLQkJCQkJLy8gb25seSBhbGxvdyBkZXRhaWxzIGVkaXRpbmcgaW4gRGVmaW5lZEludGVyZmFjZXNUYWJsZQ0KLS8vCQkJCQlBYnN0cmFjdExpc3RDb21wb3NpdGUuU0hPV19ERVRBSUxTIHwNCi0JCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5BRERfQlVUVE9OIHwNCi0JCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5NT1ZFX0JVVFRPTlMgfA0KLQkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLlJFTU9WRV9CVVRUT04pOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBiaW5kTGlzdChmaW5hbCBFT2JqZWN0IHRoZW9iamVjdCwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIHRoZWZlYXR1cmUpIHsNCi0JCQlzdXBlci5iaW5kTGlzdCh0aGVvYmplY3QsIHRoZWZlYXR1cmUpOw0KLQkJCWlmICh0aGVvYmplY3QgaW5zdGFuY2VvZiBQYXJ0aWNpcGFudCkNCi0JCQkJc2V0VGl0bGUoIkludGVyZmFjZXMgUHJvdmlkZWQgYnkgUGFydGljaXBhbnQiKTsNCi0JCQllbHNlIGlmICh0aGVvYmplY3QgaW5zdGFuY2VvZiBDYWxsYWJsZUVsZW1lbnQpDQotCQkJCXNldFRpdGxlKCJJbnRlcmZhY2VzIFByb3ZpZGVkIGJ5IFByb2Nlc3MiKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgRU9iamVjdCBhZGRMaXN0SXRlbShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCQlEZWZpbml0aW9ucyBkZWZzID0gTW9kZWxVdGlsLmdldERlZmluaXRpb25zKG9iamVjdCk7DQotCQkJZmluYWwgTGlzdDxJbnRlcmZhY2U+aXRlbXMgPSBuZXcgQXJyYXlMaXN0PEludGVyZmFjZT4oKTsNCi0JCQlmb3IgKEVPYmplY3QgbyA6IGRlZnMuZ2V0Um9vdEVsZW1lbnRzKCkpIHsNCi0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJbnRlcmZhY2UpIHsNCi0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJ0aWNpcGFudCkgew0KLQkJCQkJCVBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gKFBhcnRpY2lwYW50KW9iamVjdDsNCi0JCQkJCQlpZiAoIXBhcnRpY2lwYW50LmdldEludGVyZmFjZVJlZnMoKS5jb250YWlucyhvKSkNCi0JCQkJCQkJaXRlbXMuYWRkKChJbnRlcmZhY2Upbyk7DQotCQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhbGxhYmxlRWxlbWVudCkgew0KLQkJCQkJCUNhbGxhYmxlRWxlbWVudCBjYWxsYWJsZUVsZW1lbnQgPSAoQ2FsbGFibGVFbGVtZW50KW9iamVjdDsNCi0JCQkJCQlpZiAoIWNhbGxhYmxlRWxlbWVudC5nZXRTdXBwb3J0ZWRJbnRlcmZhY2VSZWZzKCkuY29udGFpbnMobykpDQotCQkJCQkJCWl0ZW1zLmFkZCgoSW50ZXJmYWNlKW8pOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJCUludGVyZmFjZSBpZmFjZSA9IG51bGw7DQotCQkJTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdERpYWxvZyhnZXRTaGVsbCgpKTsNCi0JCQlpZiAoaXRlbXMuc2l6ZSgpPjEpIHsNCi0JCQkJZGlhbG9nLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7DQotCQkNCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCQkJCX0NCi0JCQ0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsNCi0JCQkJCX0NCi0JCQ0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgew0KLQkJCQkJCXJldHVybiBpdGVtcy50b0FycmF5KCk7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJfSk7DQotCQkJCWRpYWxvZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJTGFiZWxQcm92aWRlcigpIHsNCi0JCQ0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQkJCQl9DQotCQkNCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCQkJCX0NCi0JCQ0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgew0KLQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCX0NCi0JCQ0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQkJCQl9DQotCQkNCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7DQotCQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCQl9DQotCQkNCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7DQotCQkJCQkJcmV0dXJuIE1vZGVsVXRpbC5nZXROYW1lKChCYXNlRWxlbWVudCllbGVtZW50KTsNCi0JCQkJCX0NCi0JCQkJCQ0KLQkJCQl9KTsNCi0JCQkJZGlhbG9nLnNldFRpdGxlKCJJbnRlcmZhY2VzIik7DQotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKCJTZWxlY3QgdGhlIEludGVyZmFjZSBwcm92aWRlZCBieSB0aGlzIFByb2Nlc3MiKTsNCi0JCQkJZGlhbG9nLnNldEFkZENhbmNlbEJ1dHRvbih0cnVlKTsNCi0JCQkJZGlhbG9nLnNldEhlbHBBdmFpbGFibGUoZmFsc2UpOw0KLQkJCQlkaWFsb2cuc2V0SW5wdXQobmV3IE9iamVjdCgpKTsNCi0NCi0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7DQotCQkJCQlpZmFjZSA9IChJbnRlcmZhY2UpZGlhbG9nLmdldFJlc3VsdCgpWzBdOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGl0ZW1zLnNpemUoKT09MSkgew0KLQkJCQlpZmFjZSA9IGl0ZW1zLmdldCgwKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNoZWxsKCksICJObyBEZWZpbmVkIEludGVyZmFjZXMiLA0KLQkJCQkJCSJUaGVyZSBhcmUgbm8gbmV3IEludGVyZmFjZXMgdG8gYWRkLlxuIisNCi0JCQkJCQkiUGxlYXNlIGNyZWF0ZSBhIG5ldyBJbnRlcmZhY2UgaW4gdGhlIFwiRGVmaW5lZCBJbnRlcmZhY2VzXCIgZmlyc3QuIg0KLQkJCQkpOw0KLQkJCX0NCi0JCQkNCi0JCQlpZiAoaWZhY2UhPW51bGwpIHsNCi0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcnRpY2lwYW50KSB7DQotCQkJCQlQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IChQYXJ0aWNpcGFudClvYmplY3Q7DQotCQkJCQlwYXJ0aWNpcGFudC5nZXRJbnRlcmZhY2VSZWZzKCkuYWRkKGlmYWNlKTsNCi0JCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDYWxsYWJsZUVsZW1lbnQpIHsNCi0JCQkJCUNhbGxhYmxlRWxlbWVudCBjYWxsYWJsZUVsZW1lbnQgPSAoQ2FsbGFibGVFbGVtZW50KW9iamVjdDsNCi0JCQkJCWNhbGxhYmxlRWxlbWVudC5nZXRTdXBwb3J0ZWRJbnRlcmZhY2VSZWZzKCkuYWRkKGlmYWNlKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gaWZhY2U7DQotCQl9DQotCX0NCi0JDQotfQ0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5kYXRhOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQmFzZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQnBtbjJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkNhbGxhYmxlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5EZWZpbml0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5JbnRlcmZhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuUHJvY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5kaS5CUE1ORGlhZ3JhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdEJwbW4yUHJvcGVydHlTZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0RGV0YWlsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0TGlzdENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5EZWZhdWx0RGV0YWlsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHRMaXN0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHRQcm9wZXJ0eVNlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuTGlzdENvbXBvc2l0ZUNvbHVtblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLlByb3BlcnRpZXNDb21wb3NpdGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tb2RlbC5CcG1uMk1vZGVsZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS51dGlscy5Nb2RlbFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKKworcHVibGljIGNsYXNzIEludGVyZmFjZVByb3BlcnR5U2VjdGlvbiBleHRlbmRzIERlZmF1bHRQcm9wZXJ0eVNlY3Rpb24geworCisJc3RhdGljIHsKKwkJUHJvcGVydGllc0NvbXBvc2l0ZUZhY3RvcnkucmVnaXN0ZXIoSW50ZXJmYWNlLmNsYXNzLCBJbnRlcmZhY2VEZXRhaWxDb21wb3NpdGUuY2xhc3MpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBBYnN0cmFjdERldGFpbENvbXBvc2l0ZSBjcmVhdGVTZWN0aW9uUm9vdCgpIHsKKwkJcmV0dXJuIG5ldyBJbnRlcmZhY2VTZWN0aW9uUm9vdCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgSW50ZXJmYWNlUHJvcGVydHlTZWN0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChQaWN0b2dyYW1FbGVtZW50IHBlKSB7CisJCUVPYmplY3QgYm8gPSBzdXBlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOworCQlpZiAoYm8gaW5zdGFuY2VvZiBQYXJ0aWNpcGFudCkgeworCQkJcmV0dXJuIGJvOworCQl9IGVsc2UgaWYgKGJvIGluc3RhbmNlb2YgQlBNTkRpYWdyYW0pIHsKKwkJCUJhc2VFbGVtZW50IGJlID0gKChCUE1ORGlhZ3JhbSlibykuZ2V0UGxhbmUoKS5nZXRCcG1uRWxlbWVudCgpOworCQkJaWYgKGJlIGluc3RhbmNlb2YgUHJvY2VzcykKKwkJCQlyZXR1cm4gYmU7CisJCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBDYWxsYWJsZUVsZW1lbnQpIHsKKwkJCXJldHVybiBibzsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBjbGFzcyBJbnRlcmZhY2VTZWN0aW9uUm9vdCBleHRlbmRzIERlZmF1bHREZXRhaWxDb21wb3NpdGUgeworCisJCURlZmluZWRJbnRlcmZhY2VMaXN0Q29tcG9zaXRlIGRlZmluZWRJbnRlcmZhY2VzVGFibGU7CisJCVByb3ZpZGVkSW50ZXJmYWNlTGlzdENvbXBvc2l0ZSBwcm92aWRlZEludGVyZmFjZXNUYWJsZTsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gcGFyZW50CisJCSAqIEBwYXJhbSBzdHlsZQorCQkgKi8KKwkJcHVibGljIEludGVyZmFjZVNlY3Rpb25Sb290KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworCQkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIHNlY3Rpb24KKwkJICovCisJCXB1YmxpYyBJbnRlcmZhY2VTZWN0aW9uUm9vdChBYnN0cmFjdEJwbW4yUHJvcGVydHlTZWN0aW9uIHNlY3Rpb24pIHsKKwkJCXN1cGVyKHNlY3Rpb24pOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGNsZWFuQmluZGluZ3MoKSB7CisJCQlzdXBlci5jbGVhbkJpbmRpbmdzKCk7CisJCQlkZWZpbmVkSW50ZXJmYWNlc1RhYmxlID0gbnVsbDsKKwkJCXByb3ZpZGVkSW50ZXJmYWNlc1RhYmxlID0gbnVsbDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBjcmVhdGVCaW5kaW5ncyhFT2JqZWN0IGJlKSB7CisJCQlkZWZpbmVkSW50ZXJmYWNlc1RhYmxlID0gbmV3IERlZmluZWRJbnRlcmZhY2VMaXN0Q29tcG9zaXRlKHRoaXMpOworCQkJZGVmaW5lZEludGVyZmFjZXNUYWJsZS5iaW5kTGlzdChiZSk7CisKKwkJCWlmIChiZSBpbnN0YW5jZW9mIFBhcnRpY2lwYW50KSB7CisJCQkJcHJvdmlkZWRJbnRlcmZhY2VzVGFibGUgPSBuZXcgUHJvdmlkZWRJbnRlcmZhY2VMaXN0Q29tcG9zaXRlKHRoaXMpOworCQkJCXByb3ZpZGVkSW50ZXJmYWNlc1RhYmxlLmJpbmRMaXN0KGJlLCBnZXRGZWF0dXJlKGJlLCAiaW50ZXJmYWNlUmVmcyIpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGJlIGluc3RhbmNlb2YgQ2FsbGFibGVFbGVtZW50KSB7CisJCQkJQ2FsbGFibGVFbGVtZW50IGNlID0gKENhbGxhYmxlRWxlbWVudCliZTsKKwkJCQlwcm92aWRlZEludGVyZmFjZXNUYWJsZSA9IG5ldyBQcm92aWRlZEludGVyZmFjZUxpc3RDb21wb3NpdGUodGhpcyk7CisJCQkJcHJvdmlkZWRJbnRlcmZhY2VzVGFibGUuYmluZExpc3QoYmUsIGdldEZlYXR1cmUoYmUsICJzdXBwb3J0ZWRJbnRlcmZhY2VSZWZzIikpOworCQkJfQorCQl9CisJfQorCQorCXB1YmxpYyBjbGFzcyBEZWZpbmVkSW50ZXJmYWNlTGlzdENvbXBvc2l0ZSBleHRlbmRzIERlZmF1bHRMaXN0Q29tcG9zaXRlIHsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gc2VjdGlvbgorCQkgKiBAcGFyYW0gc3R5bGUKKwkJICovCisJCXB1YmxpYyBEZWZpbmVkSW50ZXJmYWNlTGlzdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CisJCQlzdXBlcihwYXJlbnQsCisJCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5TSE9XX0RFVEFJTFMgfAorCQkJCQlBYnN0cmFjdExpc3RDb21wb3NpdGUuQUREX0JVVFRPTiB8CisJCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5NT1ZFX0JVVFRPTlMgfAorCQkJCQlBYnN0cmFjdExpc3RDb21wb3NpdGUuREVMRVRFX0JVVFRPTik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEVDbGFzcyBnZXRMaXN0SXRlbUNsYXNzKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJcmV0dXJuIGxpc3RJdGVtQ2xhc3MgPSBCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVyZmFjZSgpOworCQl9CisKKwkJcHVibGljIHZvaWQgYmluZExpc3QoRU9iamVjdCB0aGVvYmplY3QpIHsKKwkJCURlZmluaXRpb25zIGRlZnMgPSBNb2RlbFV0aWwuZ2V0RGVmaW5pdGlvbnModGhlb2JqZWN0KTsKKwkJCXN1cGVyLmJpbmRMaXN0KGRlZnMsIEJwbW4yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmaW5pdGlvbnNfUm9vdEVsZW1lbnRzKCkpOworCQkJc2V0VGl0bGUoIkFsbCBEZWZpbmVkIEludGVyZmFjZXMiKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRU9iamVjdCBhZGRMaXN0SXRlbShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCUludGVyZmFjZSBpZmFjZSA9IChJbnRlcmZhY2UpIE1vZGVsVXRpbC5jcmVhdGVPYmplY3Qob2JqZWN0LmVSZXNvdXJjZSgpLCBQQUNLQUdFLmdldEludGVyZmFjZSgpKTsKKwkJCQorCQkJRUxpc3Q8RU9iamVjdD4gbGlzdCA9IChFTGlzdDxFT2JqZWN0PilvYmplY3QuZUdldChmZWF0dXJlKTsKKwkJCWxpc3QuYWRkKGlmYWNlKTsKKwkJCXJldHVybiBpZmFjZTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBMaXN0Q29tcG9zaXRlQ29sdW1uUHJvdmlkZXIgZ2V0Q29sdW1uUHJvdmlkZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlpZiAoY29sdW1uUHJvdmlkZXI9PW51bGwpIHsKKwkJCQljb2x1bW5Qcm92aWRlciA9IG5ldyBMaXN0Q29tcG9zaXRlQ29sdW1uUHJvdmlkZXIodGhpcywgZmFsc2UpOworCQkJCWNvbHVtblByb3ZpZGVyLmFkZChuZXcgVGFibGVDb2x1bW4ob2JqZWN0LCBCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVyZmFjZV9OYW1lKCkpKTsKKwkJCQljb2x1bW5Qcm92aWRlci5hZGQobmV3IFRhYmxlQ29sdW1uKG9iamVjdCxCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVyZmFjZV9JbXBsZW1lbnRhdGlvblJlZigpKSk7CisJCQl9CisJCQlyZXR1cm4gY29sdW1uUHJvdmlkZXI7CisJCX0KKwl9CisJCisJcHVibGljIGNsYXNzIFByb3ZpZGVkSW50ZXJmYWNlTGlzdENvbXBvc2l0ZSBleHRlbmRzIERlZmF1bHRMaXN0Q29tcG9zaXRlIHsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gc2VjdGlvbgorCQkgKiBAcGFyYW0gc3R5bGUKKwkJICovCisJCXB1YmxpYyBQcm92aWRlZEludGVyZmFjZUxpc3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJc3VwZXIocGFyZW50LAorCQkJCQkvLyBvbmx5IGFsbG93IGRldGFpbHMgZWRpdGluZyBpbiBEZWZpbmVkSW50ZXJmYWNlc1RhYmxlCisvLwkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLlNIT1dfREVUQUlMUyB8CisJCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5BRERfQlVUVE9OIHwKKwkJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLk1PVkVfQlVUVE9OUyB8CisJCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5SRU1PVkVfQlVUVE9OKTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgYmluZExpc3QoZmluYWwgRU9iamVjdCB0aGVvYmplY3QsIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSB0aGVmZWF0dXJlKSB7CisJCQlzdXBlci5iaW5kTGlzdCh0aGVvYmplY3QsIHRoZWZlYXR1cmUpOworCQkJaWYgKHRoZW9iamVjdCBpbnN0YW5jZW9mIFBhcnRpY2lwYW50KQorCQkJCXNldFRpdGxlKCJJbnRlcmZhY2VzIFByb3ZpZGVkIGJ5IFBhcnRpY2lwYW50Iik7CisJCQllbHNlIGlmICh0aGVvYmplY3QgaW5zdGFuY2VvZiBDYWxsYWJsZUVsZW1lbnQpCisJCQkJc2V0VGl0bGUoIkludGVyZmFjZXMgUHJvdmlkZWQgYnkgUHJvY2VzcyIpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEVPYmplY3QgYWRkTGlzdEl0ZW0oRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlEZWZpbml0aW9ucyBkZWZzID0gTW9kZWxVdGlsLmdldERlZmluaXRpb25zKG9iamVjdCk7CisJCQlmaW5hbCBMaXN0PEludGVyZmFjZT5pdGVtcyA9IG5ldyBBcnJheUxpc3Q8SW50ZXJmYWNlPigpOworCQkJZm9yIChFT2JqZWN0IG8gOiBkZWZzLmdldFJvb3RFbGVtZW50cygpKSB7CisJCQkJaWYgKG8gaW5zdGFuY2VvZiBJbnRlcmZhY2UpIHsKKwkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcnRpY2lwYW50KSB7CisJCQkJCQlQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IChQYXJ0aWNpcGFudClvYmplY3Q7CisJCQkJCQlpZiAoIXBhcnRpY2lwYW50LmdldEludGVyZmFjZVJlZnMoKS5jb250YWlucyhvKSkKKwkJCQkJCQlpdGVtcy5hZGQoKEludGVyZmFjZSlvKTsKKwkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDYWxsYWJsZUVsZW1lbnQpIHsKKwkJCQkJCUNhbGxhYmxlRWxlbWVudCBjYWxsYWJsZUVsZW1lbnQgPSAoQ2FsbGFibGVFbGVtZW50KW9iamVjdDsKKwkJCQkJCWlmICghY2FsbGFibGVFbGVtZW50LmdldFN1cHBvcnRlZEludGVyZmFjZVJlZnMoKS5jb250YWlucyhvKSkKKwkJCQkJCQlpdGVtcy5hZGQoKEludGVyZmFjZSlvKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUludGVyZmFjZSBpZmFjZSA9IG51bGw7CisJCQlMaXN0RGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0RGlhbG9nKGdldFNoZWxsKCkpOworCQkJaWYgKGl0ZW1zLnNpemUoKT4xKSB7CisJCQkJZGlhbG9nLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7CisJCQorCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCQkJfQorCQkKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQkJCQl9CisJCQorCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCQkJCXJldHVybiBpdGVtcy50b0FycmF5KCk7CisJCQkJCX0KKwkJCQkJCisJCQkJfSk7CisJCQkJZGlhbG9nLnNldExhYmVsUHJvdmlkZXIobmV3IElMYWJlbFByb3ZpZGVyKCkgeworCQkKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCQkJfQorCQkKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkJCX0KKwkJCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQorCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJCQl9CisJCQorCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCQkJcmV0dXJuIE1vZGVsVXRpbC5nZXROYW1lKChCYXNlRWxlbWVudCllbGVtZW50KTsKKwkJCQkJfQorCQkJCQkKKwkJCQl9KTsKKwkJCQlkaWFsb2cuc2V0VGl0bGUoIkludGVyZmFjZXMiKTsKKwkJCQlkaWFsb2cuc2V0TWVzc2FnZSgiU2VsZWN0IHRoZSBJbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhpcyBQcm9jZXNzIik7CisJCQkJZGlhbG9nLnNldEFkZENhbmNlbEJ1dHRvbih0cnVlKTsKKwkJCQlkaWFsb2cuc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7CisJCQkJZGlhbG9nLnNldElucHV0KG5ldyBPYmplY3QoKSk7CisKKwkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKKwkJCQkJaWZhY2UgPSAoSW50ZXJmYWNlKWRpYWxvZy5nZXRSZXN1bHQoKVswXTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChpdGVtcy5zaXplKCk9PTEpIHsKKwkJCQlpZmFjZSA9IGl0ZW1zLmdldCgwKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNoZWxsKCksICJObyBEZWZpbmVkIEludGVyZmFjZXMiLAorCQkJCQkJIlRoZXJlIGFyZSBubyBuZXcgSW50ZXJmYWNlcyB0byBhZGQuXG4iKworCQkJCQkJIlBsZWFzZSBjcmVhdGUgYSBuZXcgSW50ZXJmYWNlIGluIHRoZSBcIkRlZmluZWQgSW50ZXJmYWNlc1wiIGZpcnN0LiIKKwkJCQkpOworCQkJfQorCQkJCisJCQlpZiAoaWZhY2UhPW51bGwpIHsKKwkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUGFydGljaXBhbnQpIHsKKwkJCQkJUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSAoUGFydGljaXBhbnQpb2JqZWN0OworCQkJCQlwYXJ0aWNpcGFudC5nZXRJbnRlcmZhY2VSZWZzKCkuYWRkKGlmYWNlKTsKKwkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhbGxhYmxlRWxlbWVudCkgeworCQkJCQlDYWxsYWJsZUVsZW1lbnQgY2FsbGFibGVFbGVtZW50ID0gKENhbGxhYmxlRWxlbWVudClvYmplY3Q7CisJCQkJCWNhbGxhYmxlRWxlbWVudC5nZXRTdXBwb3J0ZWRJbnRlcmZhY2VSZWZzKCkuYWRkKGlmYWNlKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBpZmFjZTsKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZGF0YS9NZXNzYWdlTGlzdENvbXBvc2l0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9wcm9wZXJ0eS9kYXRhL01lc3NhZ2VMaXN0Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiMGQzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZGF0YS9NZXNzYWdlTGlzdENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5kYXRhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQnBtbjJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3RMaXN0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHRMaXN0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkxpc3RDb21wb3NpdGVDb2x1bW5Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE1lc3NhZ2VMaXN0Q29tcG9zaXRlIGV4dGVuZHMgRGVmYXVsdExpc3RDb21wb3NpdGUgeworCisJcHVibGljIE1lc3NhZ2VMaXN0Q29tcG9zaXRlKEFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24gc2VjdGlvbiwgaW50IHN0eWxlKSB7CisJCXN1cGVyKHNlY3Rpb24sIHN0eWxlKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJcHVibGljIE1lc3NhZ2VMaXN0Q29tcG9zaXRlKEFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24gc2VjdGlvbikgeworCQlzdXBlcihzZWN0aW9uLAorCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5TSE9XX0RFVEFJTFMgfAorCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5BRERfQlVUVE9OIHwKKwkJCQlBYnN0cmFjdExpc3RDb21wb3NpdGUuTU9WRV9CVVRUT05TIHwKKwkJCQlBYnN0cmFjdExpc3RDb21wb3NpdGUuREVMRVRFX0JVVFRPTik7CisJfQorCisJcHVibGljIE1lc3NhZ2VMaXN0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworCQlzdXBlcihwYXJlbnQsCisJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLlNIT1dfREVUQUlMUyB8CisJCQkJQWJzdHJhY3RMaXN0Q29tcG9zaXRlLkFERF9CVVRUT04gfAorCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5NT1ZFX0JVVFRPTlMgfAorCQkJCUFic3RyYWN0TGlzdENvbXBvc2l0ZS5ERUxFVEVfQlVUVE9OKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIExpc3RDb21wb3NpdGVDb2x1bW5Qcm92aWRlciBnZXRDb2x1bW5Qcm92aWRlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJaWYgKGNvbHVtblByb3ZpZGVyPT1udWxsKSB7CisJCQljb2x1bW5Qcm92aWRlciA9IG5ldyBMaXN0Q29tcG9zaXRlQ29sdW1uUHJvdmlkZXIodGhpcywgZmFsc2UpOworCQkJY29sdW1uUHJvdmlkZXIuYWRkKG5ldyBUYWJsZUNvbHVtbihvYmplY3QsQnBtbjJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlX05hbWUoKSkpOworCQkJY29sdW1uUHJvdmlkZXIuYWRkKG5ldyBUYWJsZUNvbHVtbihvYmplY3QsQnBtbjJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlX0l0ZW1SZWYoKSkpOworCQl9CisJCXJldHVybiBjb2x1bW5Qcm92aWRlcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL3Byb3BlcnR5L2RhdGEvTWVzc2FnZVByb3BlcnR5U2VjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9wcm9wZXJ0eS9kYXRhL01lc3NhZ2VQcm9wZXJ0eVNlY3Rpb24uamF2YQppbmRleCA5ZDUwZGI3Li4zMGEyM2RkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL3Byb3BlcnR5L2RhdGEvTWVzc2FnZVByb3BlcnR5U2VjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZGF0YS9NZXNzYWdlUHJvcGVydHlTZWN0aW9uLmphdmEKQEAgLTEsNTEgKzEsNTIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAqIENvcHlyaWdodCAoYykgMjAxMSBSZWQgSGF0LCBJbmMuIA0KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiANCi0gKiBUaGlzIHByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSANCi0gKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIA0KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgDQotICogDQotICogQ29udHJpYnV0b3JzOiANCi0gKiBSZWQgSGF0LCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIA0KLSAqDQotICogQGF1dGhvciBJbm5hciBNYWRlDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkucHJvcGVydHkuZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuUHJvcGVydHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0RGV0YWlsQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5Qcm9wZXJ0aWVzQ29tcG9zaXRlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7DQotDQotcHVibGljIGNsYXNzIE1lc3NhZ2VQcm9wZXJ0eVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEJwbW4yUHJvcGVydHlTZWN0aW9uIGltcGxlbWVudHMgSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzIHsNCi0Jc3RhdGljIHsNCi0JCVByb3BlcnRpZXNDb21wb3NpdGVGYWN0b3J5LnJlZ2lzdGVyKE1lc3NhZ2UuY2xhc3MsIE1lc3NhZ2VEZXRhaWxDb21wb3NpdGUuY2xhc3MpOw0KLQkJUHJvcGVydGllc0NvbXBvc2l0ZUZhY3RvcnkucmVnaXN0ZXIoUHJvcGVydHkuY2xhc3MsIEl0ZW1Bd2FyZUVsZW1lbnREZXRhaWxDb21wb3NpdGUuY2xhc3MpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpLnByb3BlcnR5LkFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlU2VjdGlvblJvb3QoKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBBYnN0cmFjdERldGFpbENvbXBvc2l0ZSBjcmVhdGVTZWN0aW9uUm9vdCgpIHsNCi0JCXJldHVybiBuZXcgTWVzc2FnZURldGFpbENvbXBvc2l0ZSh0aGlzKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFic3RyYWN0RGV0YWlsQ29tcG9zaXRlIGNyZWF0ZVNlY3Rpb25Sb290KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLQkJcmV0dXJuIG5ldyBNZXNzYWdlRGV0YWlsQ29tcG9zaXRlKHBhcmVudCxzdHlsZSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFT2JqZWN0IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChQaWN0b2dyYW1FbGVtZW50IHBlKSB7DQotCQlFT2JqZWN0IGJlID0gc3VwZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsNCi0JCWlmIChiZSBpbnN0YW5jZW9mIE1lc3NhZ2UpDQotCQkJcmV0dXJuIGJlOw0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUmVkIEhhdCwgSW5jLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIAorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCAKKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiBSZWQgSGF0LCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoKKyAqIEBhdXRob3IgSW5uYXIgTWFkZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5kYXRhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdEJwbW4yUHJvcGVydHlTZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0RGV0YWlsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLlByb3BlcnRpZXNDb21wb3NpdGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgTWVzc2FnZVByb3BlcnR5U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24gaW1wbGVtZW50cyBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMgeworCXN0YXRpYyB7CisJCVByb3BlcnRpZXNDb21wb3NpdGVGYWN0b3J5LnJlZ2lzdGVyKE1lc3NhZ2UuY2xhc3MsIE1lc3NhZ2VEZXRhaWxDb21wb3NpdGUuY2xhc3MpOworCQlQcm9wZXJ0aWVzQ29tcG9zaXRlRmFjdG9yeS5yZWdpc3RlcihNZXNzYWdlLmNsYXNzLCBNZXNzYWdlTGlzdENvbXBvc2l0ZS5jbGFzcyk7CisJCVByb3BlcnRpZXNDb21wb3NpdGVGYWN0b3J5LnJlZ2lzdGVyKFByb3BlcnR5LmNsYXNzLCBJdGVtQXdhcmVFbGVtZW50RGV0YWlsQ29tcG9zaXRlLmNsYXNzKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpLnByb3BlcnR5LkFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlU2VjdGlvblJvb3QoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBBYnN0cmFjdERldGFpbENvbXBvc2l0ZSBjcmVhdGVTZWN0aW9uUm9vdCgpIHsKKwkJcmV0dXJuIG5ldyBNZXNzYWdlRGV0YWlsQ29tcG9zaXRlKHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBYnN0cmFjdERldGFpbENvbXBvc2l0ZSBjcmVhdGVTZWN0aW9uUm9vdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJcmV0dXJuIG5ldyBNZXNzYWdlRGV0YWlsQ29tcG9zaXRlKHBhcmVudCxzdHlsZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KFBpY3RvZ3JhbUVsZW1lbnQgcGUpIHsKKwkJRU9iamVjdCBiZSA9IHN1cGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7CisJCWlmIChiZSBpbnN0YW5jZW9mIE1lc3NhZ2UpCisJCQlyZXR1cm4gYmU7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZGlhZ3JhbXMvRGVmaW5pdGlvbnNQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9wcm9wZXJ0eS9kaWFncmFtcy9EZWZpbml0aW9uc1Byb3BlcnR5Q29tcG9zaXRlLmphdmEKaW5kZXggN2YzODFlNi4uMWM2ZWRlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9wcm9wZXJ0eS9kaWFncmFtcy9EZWZpbml0aW9uc1Byb3BlcnR5Q29tcG9zaXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9wcm9wZXJ0eS9kaWFncmFtcy9EZWZpbml0aW9uc1Byb3BlcnR5Q29tcG9zaXRlLmphdmEKQEAgLTI1NCw3ICsyNTQsNyBAQAogCQkJaW50IGNvbHVtbkluZGV4OwogCQkJCiAJCQlwdWJsaWMgTmFtZXNwYWNlc1RhYmxlQ29sdW1uKEVPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlzdXBlcihvYmplY3QsbnVsbCk7CisJCQkJc3VwZXIob2JqZWN0LChFU3RydWN0dXJhbEZlYXR1cmUpbnVsbCk7CiAJCQkJdGhpcy5jb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4OwogCQkJfQogCkBAIC0yOTYsNyArMjk2LDcgQEAKIAkJCQljb2x1bW5Qcm92aWRlciA9IG5ldyBMaXN0Q29tcG9zaXRlQ29sdW1uUHJvdmlkZXIodGhpcyk7CiAJCQkJCiAJCQkJLy8gYWRkIGEgbmFtZXNwYWNlIHByZWZpeCBjb2x1bW4gdGhhdCBkb2VzIE5PVCBjb21lIGZyb20gdGhlIEltcG9ydCBvYmplY3QKLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihvYmplY3QsbnVsbCkgeworCQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG9iamVjdCwoRVN0cnVjdHVyYWxGZWF0dXJlKW51bGwpIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyVGV4dCgpIHsKIAkJCQkJCXJldHVybiAiTmFtZXNwYWNlIFByZWZpeCI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL3Byb3BlcnR5L2dhdGV3YXlzL0dhdGV3YXlEZXRhaWxDb21wb3NpdGUuamF2YSBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZ2F0ZXdheXMvR2F0ZXdheURldGFpbENvbXBvc2l0ZS5qYXZhCmluZGV4IGEyZDdhN2YuLjYxYzU0MTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZ2F0ZXdheXMvR2F0ZXdheURldGFpbENvbXBvc2l0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvZ2F0ZXdheXMvR2F0ZXdheURldGFpbENvbXBvc2l0ZS5qYXZhCkBAIC0xLDI1NiArMSwyNTYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDExIFJlZCBIYXQsIEluYy4NCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKiBUaGlzIHByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQ0KLSAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwNCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqDQotICogQGF1dGhvciBCb2IgQnJvZHQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5nYXRld2F5czsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkJwbW4yUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuR2F0ZXdheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuU2VxdWVuY2VGbG93Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdEJwbW4yUHJvcGVydHlTZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdExpc3RDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHREZXRhaWxDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHRMaXN0Q29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5MaXN0Q29tcG9zaXRlQ29sdW1uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkxpc3RDb21wb3NpdGVDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLlRhYmxlQ29sdW1uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUudXRpbHMuTW9kZWxVdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBHYXRld2F5RGV0YWlsQ29tcG9zaXRlIGV4dGVuZHMgRGVmYXVsdERldGFpbENvbXBvc2l0ZSB7DQotDQotCXByaXZhdGUgU2VxdWVuY2VGbG93c0xpc3RDb21wb3NpdGUgc2VxdWVuY2VGbG93c0xpc3Q7DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gc2VjdGlvbg0KLQkgKi8NCi0JcHVibGljIEdhdGV3YXlEZXRhaWxDb21wb3NpdGUoQWJzdHJhY3RCcG1uMlByb3BlcnR5U2VjdGlvbiBzZWN0aW9uKSB7DQotCQlzdXBlcihzZWN0aW9uKTsNCi0JfQ0KLQkNCi0JcHVibGljIEdhdGV3YXlEZXRhaWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFic3RyYWN0UHJvcGVydGllc1Byb3ZpZGVyIGdldFByb3BlcnRpZXNQcm92aWRlcihFT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKHByb3BlcnRpZXNQcm92aWRlciA9PSBudWxsKSB7DQotCQkJcHJvcGVydGllc1Byb3ZpZGVyID0gbmV3IEFic3RyYWN0UHJvcGVydGllc1Byb3ZpZGVyKG9iamVjdCkgew0KLQkJCQkvLyBsdW1wIGFsbCB0aGUgZ2F0ZXdheSBwcm9wZXJ0aWVzIGludG8gb25lIGNvbXBvc2l0ZQ0KLQkJCQkvLyBpZiBhIGdhdGV3YXkgZG9lc24ndCBoYXZlIG9uZSBvZiB0aGUgYXR0cmlidXRlcyBsaXN0ZWQgaGVyZSwNCi0JCQkJLy8gaXQgc2ltcGx5IHdvbid0IGJlIGRpc3BsYXllZC4NCi0JCQkJU3RyaW5nW10gcHJvcGVydGllcyA9IG5ldyBTdHJpbmdbXSB7DQotCQkJCQkJImdhdGV3YXlEaXJlY3Rpb24iLA0KLQkJCQkJCSJpbnN0YW50aWF0ZSIsDQotCQkJCQkJImFjdGl2YXRpb25Db25kaXRpb24iLA0KLQkJCQkJCSJldmVudEdhdGV3YXlUeXBlIg0KLQkJCQkJCS8vIG5vdGU6ICJkZWZhdWx0IiBzZXF1ZW5jZSBmbG93IGlzIGFscmVhZHkgYmVpbmcgZGlzcGxheWVkIGluIHRoZSBTZXF1ZW5jZUZsb3cgdGFiDQotCQkJCQkJLy8gc28sIG5vIG5lZWQgdG8gc2hvdyBpdCBoZXJlDQotCQkJCX07DQotCQkJCQ0KLQkJCQlAT3ZlcnJpZGUNCi0JCQkJcHVibGljIFN0cmluZ1tdIGdldFByb3BlcnRpZXMoKSB7DQotCQkJCQlyZXR1cm4gcHJvcGVydGllczsgDQotCQkJCX0NCi0JCQl9Ow0KLQkJfQ0KLQkJcmV0dXJuIHByb3BlcnRpZXNQcm92aWRlcjsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgY2xlYW5CaW5kaW5ncygpIHsNCi0JCXN1cGVyLmNsZWFuQmluZGluZ3MoKTsNCi0JCXNlcXVlbmNlRmxvd3NMaXN0ID0gbnVsbDsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgY3JlYXRlQmluZGluZ3MoRU9iamVjdCBiZSkgew0KLQkJc3VwZXIuY3JlYXRlQmluZGluZ3MoYmUpOw0KLQkJR2F0ZXdheSBnYXRld2F5ID0gKEdhdGV3YXkpYmU7DQotCQlzZXF1ZW5jZUZsb3dzTGlzdCA9IG5ldyBTZXF1ZW5jZUZsb3dzTGlzdENvbXBvc2l0ZSh0aGlzKTsNCi0JCXNlcXVlbmNlRmxvd3NMaXN0LmJpbmRMaXN0KGdhdGV3YXksIEJwbW4yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rmxvd05vZGVfSW5jb21pbmcoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBBIExpc3RDb21wb3NpdGUgdGhhdCBkaXNwbGF5cyBhbGwgaW5jb21pbmcgYW5kIG91dGdvaW5nIHNlcXVlbmNlIGZsb3dzIGZvciBhIEdhdGV3YXkNCi0JICovDQotCXB1YmxpYyBjbGFzcyBTZXF1ZW5jZUZsb3dzTGlzdENvbXBvc2l0ZSBleHRlbmRzIERlZmF1bHRMaXN0Q29tcG9zaXRlIHsNCi0JCXB1YmxpYyBTZXF1ZW5jZUZsb3dzTGlzdENvbXBvc2l0ZShBYnN0cmFjdEJwbW4yUHJvcGVydHlTZWN0aW9uIHNlY3Rpb24pIHsNCi0JCQlzdXBlcihzZWN0aW9uLCBTSE9XX0RFVEFJTFMpOw0KLQkJfQ0KLQ0KLQkJDQotCQlwdWJsaWMgU2VxdWVuY2VGbG93c0xpc3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJCXN1cGVyKHBhcmVudCwgU0hPV19ERVRBSUxTKTsNCi0JCX0NCi0NCi0JCS8qIChub24tSmF2YWRvYykNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3RMaXN0Q29tcG9zaXRlI2dldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0KQ0KLQkJICogDQotCQkgKiBDcmVhdGUgYSBjdXN0b20gbGlzdCBjb250ZW50IHByb3ZpZGVyDQotCQkgKi8NCi0JCXB1YmxpYyBMaXN0Q29tcG9zaXRlQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVMaXN0PEVPYmplY3Q+bGlzdCkgew0KLQkJCWlmIChjb250ZW50UHJvdmlkZXI9PW51bGwpIHsNCi0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlcXVlbmNlRmxvd3NMaXN0Q29udGVudFByb3ZpZGVyKHRoaXMsb2JqZWN0KTsNCi0JCQl9DQotCQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsNCi0JCX0NCi0JCQ0KLQkJLyogKG5vbi1KYXZhZG9jKQ0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdExpc3RDb21wb3NpdGUjZ2V0Q29sdW1uUHJvdmlkZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpDQotCQkgKiANCi0JCSAqIENyZWF0ZSBhIGN1c3RvbSBjb2x1bW4gcHJvdmlkZXINCi0JCSAqLw0KLQkJcHVibGljIExpc3RDb21wb3NpdGVDb2x1bW5Qcm92aWRlciBnZXRDb2x1bW5Qcm92aWRlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCQlpZiAoY29sdW1uUHJvdmlkZXI9PW51bGwpIHsNCi0JCQkJY29sdW1uUHJvdmlkZXIgPSBuZXcgU2VxdWVuY2VGbG93TGlzdENvbHVtblByb3ZpZGVyKHRoaXMsIG9iamVjdCk7DQotCQkJfQ0KLQkJCXJldHVybiBjb2x1bW5Qcm92aWRlcjsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIHZvaWQgYmluZExpc3QoZmluYWwgRU9iamVjdCB0aGVvYmplY3QsIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSB0aGVmZWF0dXJlKSB7DQotCQkJc3VwZXIuYmluZExpc3QodGhlb2JqZWN0LCB0aGVmZWF0dXJlKTsNCi0JCQl0YWJsZVZpZXdlci5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgew0KLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KLQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsNCi0JCQkJCUVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3Qpc2VsLmdldEZpcnN0RWxlbWVudCgpOw0KLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbUVkaXRvcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7DQotCQkJCQlMaXN0PFBpY3RvZ3JhbUVsZW1lbnQ+IHBlcyA9IEdyYXBoaXRpLmdldExpbmtTZXJ2aWNlKCkuZ2V0UGljdG9ncmFtRWxlbWVudHMoZGlhZ3JhbSwgb2JqZWN0KTsNCi0JCQkJCWdldERpYWdyYW1FZGl0b3IoKS5zZXRQaWN0b2dyYW1FbGVtZW50Rm9yU2VsZWN0aW9uKHBlcy5nZXQoMCkpOw0KLQkJCQkJZ2V0RGlhZ3JhbUVkaXRvcigpLnJlZnJlc2goKTsNCi0JCQkJfQ0KLQkJCX0pOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDdXN0b20gY29udGVudCBwcm92aWRlciBmb3IgYSBnYXRld2F5J3MgaW5jb21pbmcgYW5kIG91dGdvaW5nIHNlcXVlbmNlIGZsb3dzDQotCSAqLw0KLQlwdWJsaWMgY2xhc3MgU2VxdWVuY2VGbG93c0xpc3RDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBMaXN0Q29tcG9zaXRlQ29udGVudFByb3ZpZGVyIHsNCi0NCi0JCXB1YmxpYyBTZXF1ZW5jZUZsb3dzTGlzdENvbnRlbnRQcm92aWRlcihBYnN0cmFjdExpc3RDb21wb3NpdGUgbGlzdENvbXBvc2l0ZSwgRU9iamVjdCBvYmplY3QpIHsNCi0JCQlzdXBlcihsaXN0Q29tcG9zaXRlLCBvYmplY3QsIG51bGwsIG51bGwpOw0KLQkJCQ0KLQkJCUdhdGV3YXkgZ2F0ZXdheSA9IChHYXRld2F5KW9iamVjdDsNCi0JCQlsaXN0ID0gbmV3IEJhc2ljRUxpc3Q8RU9iamVjdD4oKTsNCi0JCQlsaXN0LmFkZEFsbChnYXRld2F5LmdldEluY29taW5nKCkpOw0KLQkJCWxpc3QuYWRkQWxsKGdhdGV3YXkuZ2V0T3V0Z29pbmcoKSk7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7DQotCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogQSBjdXN0b20gY29sdW1uIHByb3ZpZGVyIGZvciBzZXF1ZW5jZSBmbG93cw0KLQkgKi8NCi0JcHVibGljIGNsYXNzIFNlcXVlbmNlRmxvd0xpc3RDb2x1bW5Qcm92aWRlciBleHRlbmRzIExpc3RDb21wb3NpdGVDb2x1bW5Qcm92aWRlciB7DQotDQotCQlwdWJsaWMgU2VxdWVuY2VGbG93TGlzdENvbHVtblByb3ZpZGVyKEFic3RyYWN0TGlzdENvbXBvc2l0ZSBsaXN0LCBFT2JqZWN0IG9iamVjdCkgew0KLQkJCXN1cGVyKGxpc3QsIGZhbHNlKTsNCi0JCQkvLyBhZGQgMiBvciAzIGNvbHVtbnMsIGRlcGVuZGluZyBvbiBnYXRld2F5IHR5cGUNCi0JCQlhZGQobmV3IFNlcXVlbmNlRmxvd0xpc3RDb2x1bW4ob2JqZWN0LDEpKTsgLy8gaWRlbnRpZmllciAoZnJvbSAtPiB0bykNCi0JCQlhZGQobmV3IFNlcXVlbmNlRmxvd0xpc3RDb2x1bW4ob2JqZWN0LDIpKTsgLy8gQ29uZGl0aW9uIChleHByZXNzaW9uKQ0KLQkJCWlmIChvYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJkZWZhdWx0IikhPW51bGwpIHsNCi0JCQkJYWRkKG5ldyBTZXF1ZW5jZUZsb3dMaXN0Q29sdW1uKG9iamVjdCwzKSk7IC8vIElzIERlZmF1bHQgKGJvb2xlYW4pDQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogQSBjdXN0b20gVGFibGVDb2x1bW4gZm9yIHNlcXVlbmNlIGZsb3dzDQotCSAqLw0KLQlwdWJsaWMgY2xhc3MgU2VxdWVuY2VGbG93TGlzdENvbHVtbiBleHRlbmRzIFRhYmxlQ29sdW1uIHsNCi0NCi0JCWludCBjb2x1bW5JbmRleDsNCi0JCQ0KLQkNCi0JCS8qKg0KLQkJICogQ29uc3RydWN0IGEgY29sdW1uIGJ5IGdpdmluZyBpdCB0aGUgZ2F0ZXdheSBFT2JqZWN0IGFuZCBjb2x1bW4gaW5kZXgNCi0JCSAqIEBwYXJhbSBnYXRld2F5IC0gdGhlIEdhdGV3YXkgQlBNTjIgZWxlbWVudA0KLQkJICogQHBhcmFtIGNvbHVtbkluZGV4IC0gYSBjb2x1bW4gaW5kZXggYmV0d2VlbiAxIGFuZCAzOg0KLQkJICogMSA9IGRlc2NyaWJlcyB0aGUgc2VxdWVuY2UgZmxvdyBieSBzb3VyY2UgYW5kIHRhcmdldCBlbmRwb2ludHMNCi0JCSAqIDIgPSBjb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0aGlzIHNlcXVlbmNlIGZsb3cNCi0JCSAqIDMgPSB0cnVlL2ZhbHNlIGlmIHRoaXMgc2VxdWVuY2UgZmxvdyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGdhdGV3YXkNCi0JCSAqLw0KLQkJcHVibGljIFNlcXVlbmNlRmxvd0xpc3RDb2x1bW4oRU9iamVjdCBnYXRld2F5LCBpbnQgY29sdW1uSW5kZXgpIHsNCi0JCQlzdXBlcihnYXRld2F5LCBudWxsKTsNCi0JCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIFN0cmluZyBnZXRIZWFkZXJUZXh0KCkgew0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsNCi0JCQljYXNlIDE6DQotCQkJCXJldHVybiAiU2VxdWVuY2UgRmxvdyI7DQotCQkJY2FzZSAyOg0KLQkJCQlyZXR1cm4gIkNvbmRpdGlvbiI7DQotCQkJY2FzZSAzOg0KLQkJCQlyZXR1cm4gIklzIERlZmF1bHQiOw0KLQkJCX0NCi0JCQlyZXR1cm4gImhlYWRlciAiICsgY29sdW1uSW5kZXg7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLQkJCVNlcXVlbmNlRmxvdyBmbG93ID0gKFNlcXVlbmNlRmxvdyllbGVtZW50Ow0KLQkJCUdhdGV3YXkgZ2F0ZXdheSA9IChHYXRld2F5KW9iamVjdDsNCi0JCQlTdHJpbmcgdGV4dCA9ICIiOw0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsNCi0JCQljYXNlIDE6DQotCQkJCXRleHQgKz0gTW9kZWxVdGlsLmdldERpc3BsYXlOYW1lKGZsb3cuZ2V0U291cmNlUmVmKCkpOw0KLQkJCQl0ZXh0ICs9ICIgLT4gIjsNCi0JCQkJdGV4dCArPSBNb2RlbFV0aWwuZ2V0RGlzcGxheU5hbWUoZmxvdy5nZXRUYXJnZXRSZWYoKSk7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgMjoNCi0JCQkJdGV4dCA9IE1vZGVsVXRpbC5nZXREaXNwbGF5TmFtZShmbG93LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSk7DQotCQkJCWlmICh0ZXh0PT1udWxsKQ0KLQkJCQkJdGV4dCA9ICIiOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIDM6DQotCQkJCXsNCi0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZ2F0ZXdheS5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoImRlZmF1bHQiKTsNCi0JCQkJCU9iamVjdCBkZWZhdWx0RmxvdyA9IGdhdGV3YXkuZUdldChmKTsNCi0JCQkJCXRleHQgKz0gKGZsb3cgPT0gZGVmYXVsdEZsb3cpOw0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlyZXR1cm4gdGV4dDsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7DQotCQkJcmV0dXJuICJjb2x1bW4gIiArIGNvbHVtbkluZGV4Ow0KLQkJfQ0KLQl9DQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBhdXRob3IgQm9iIEJyb2R0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5wcm9wZXJ0eS5nYXRld2F5czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQnBtbjJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkdhdGV3YXk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuU2VxdWVuY2VGbG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3RMaXN0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkRlZmF1bHREZXRhaWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuRGVmYXVsdExpc3RDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuTGlzdENvbXBvc2l0ZUNvbHVtblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS5tZXJyaW1hYy5jbGFkLkxpc3RDb21wb3NpdGVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuVGFibGVDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLnV0aWxzLk1vZGVsVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEdhdGV3YXlEZXRhaWxDb21wb3NpdGUgZXh0ZW5kcyBEZWZhdWx0RGV0YWlsQ29tcG9zaXRlIHsKKworCXByaXZhdGUgU2VxdWVuY2VGbG93c0xpc3RDb21wb3NpdGUgc2VxdWVuY2VGbG93c0xpc3Q7CisKKwkvKioKKwkgKiBAcGFyYW0gc2VjdGlvbgorCSAqLworCXB1YmxpYyBHYXRld2F5RGV0YWlsQ29tcG9zaXRlKEFic3RyYWN0QnBtbjJQcm9wZXJ0eVNlY3Rpb24gc2VjdGlvbikgeworCQlzdXBlcihzZWN0aW9uKTsKKwl9CisJCisJcHVibGljIEdhdGV3YXlEZXRhaWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBYnN0cmFjdFByb3BlcnRpZXNQcm92aWRlciBnZXRQcm9wZXJ0aWVzUHJvdmlkZXIoRU9iamVjdCBvYmplY3QpIHsKKwkJaWYgKHByb3BlcnRpZXNQcm92aWRlciA9PSBudWxsKSB7CisJCQlwcm9wZXJ0aWVzUHJvdmlkZXIgPSBuZXcgQWJzdHJhY3RQcm9wZXJ0aWVzUHJvdmlkZXIob2JqZWN0KSB7CisJCQkJLy8gbHVtcCBhbGwgdGhlIGdhdGV3YXkgcHJvcGVydGllcyBpbnRvIG9uZSBjb21wb3NpdGUKKwkJCQkvLyBpZiBhIGdhdGV3YXkgZG9lc24ndCBoYXZlIG9uZSBvZiB0aGUgYXR0cmlidXRlcyBsaXN0ZWQgaGVyZSwKKwkJCQkvLyBpdCBzaW1wbHkgd29uJ3QgYmUgZGlzcGxheWVkLgorCQkJCVN0cmluZ1tdIHByb3BlcnRpZXMgPSBuZXcgU3RyaW5nW10geworCQkJCQkJImdhdGV3YXlEaXJlY3Rpb24iLAorCQkJCQkJImluc3RhbnRpYXRlIiwKKwkJCQkJCSJhY3RpdmF0aW9uQ29uZGl0aW9uIiwKKwkJCQkJCSJldmVudEdhdGV3YXlUeXBlIgorCQkJCQkJLy8gbm90ZTogImRlZmF1bHQiIHNlcXVlbmNlIGZsb3cgaXMgYWxyZWFkeSBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIFNlcXVlbmNlRmxvdyB0YWIKKwkJCQkJCS8vIHNvLCBubyBuZWVkIHRvIHNob3cgaXQgaGVyZQorCQkJCX07CisJCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFN0cmluZ1tdIGdldFByb3BlcnRpZXMoKSB7CisJCQkJCXJldHVybiBwcm9wZXJ0aWVzOyAKKwkJCQl9CisJCQl9OworCQl9CisJCXJldHVybiBwcm9wZXJ0aWVzUHJvdmlkZXI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xlYW5CaW5kaW5ncygpIHsKKwkJc3VwZXIuY2xlYW5CaW5kaW5ncygpOworCQlzZXF1ZW5jZUZsb3dzTGlzdCA9IG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlQmluZGluZ3MoRU9iamVjdCBiZSkgeworCQlzdXBlci5jcmVhdGVCaW5kaW5ncyhiZSk7CisJCUdhdGV3YXkgZ2F0ZXdheSA9IChHYXRld2F5KWJlOworCQlzZXF1ZW5jZUZsb3dzTGlzdCA9IG5ldyBTZXF1ZW5jZUZsb3dzTGlzdENvbXBvc2l0ZSh0aGlzKTsKKwkJc2VxdWVuY2VGbG93c0xpc3QuYmluZExpc3QoZ2F0ZXdheSwgQnBtbjJQYWNrYWdlLmVJTlNUQU5DRS5nZXRGbG93Tm9kZV9JbmNvbWluZygpKTsKKwl9CisJCisJLyoqCisJICogQSBMaXN0Q29tcG9zaXRlIHRoYXQgZGlzcGxheXMgYWxsIGluY29taW5nIGFuZCBvdXRnb2luZyBzZXF1ZW5jZSBmbG93cyBmb3IgYSBHYXRld2F5CisJICovCisJcHVibGljIGNsYXNzIFNlcXVlbmNlRmxvd3NMaXN0Q29tcG9zaXRlIGV4dGVuZHMgRGVmYXVsdExpc3RDb21wb3NpdGUgeworCQlwdWJsaWMgU2VxdWVuY2VGbG93c0xpc3RDb21wb3NpdGUoQWJzdHJhY3RCcG1uMlByb3BlcnR5U2VjdGlvbiBzZWN0aW9uKSB7CisJCQlzdXBlcihzZWN0aW9uLCBTSE9XX0RFVEFJTFMpOworCQl9CisKKwkJCisJCXB1YmxpYyBTZXF1ZW5jZUZsb3dzTGlzdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CisJCQlzdXBlcihwYXJlbnQsIFNIT1dfREVUQUlMUyk7CisJCX0KKworCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLm1lcnJpbWFjLmNsYWQuQWJzdHJhY3RMaXN0Q29tcG9zaXRlI2dldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0KQorCQkgKiAKKwkJICogQ3JlYXRlIGEgY3VzdG9tIGxpc3QgY29udGVudCBwcm92aWRlcgorCQkgKi8KKwkJcHVibGljIExpc3RDb21wb3NpdGVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRUxpc3Q8RU9iamVjdD5saXN0KSB7CisJCQlpZiAoY29udGVudFByb3ZpZGVyPT1udWxsKSB7CisJCQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlcXVlbmNlRmxvd3NMaXN0Q29udGVudFByb3ZpZGVyKHRoaXMsb2JqZWN0KTsKKwkJCX0KKwkJCXJldHVybiBjb250ZW50UHJvdmlkZXI7CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubWVycmltYWMuY2xhZC5BYnN0cmFjdExpc3RDb21wb3NpdGUjZ2V0Q29sdW1uUHJvdmlkZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCisJCSAqIAorCQkgKiBDcmVhdGUgYSBjdXN0b20gY29sdW1uIHByb3ZpZGVyCisJCSAqLworCQlwdWJsaWMgTGlzdENvbXBvc2l0ZUNvbHVtblByb3ZpZGVyIGdldENvbHVtblByb3ZpZGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJaWYgKGNvbHVtblByb3ZpZGVyPT1udWxsKSB7CisJCQkJY29sdW1uUHJvdmlkZXIgPSBuZXcgU2VxdWVuY2VGbG93TGlzdENvbHVtblByb3ZpZGVyKHRoaXMsIG9iamVjdCk7CisJCQl9CisJCQlyZXR1cm4gY29sdW1uUHJvdmlkZXI7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGJpbmRMaXN0KGZpbmFsIEVPYmplY3QgdGhlb2JqZWN0LCBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgdGhlZmVhdHVyZSkgeworCQkJc3VwZXIuYmluZExpc3QodGhlb2JqZWN0LCB0aGVmZWF0dXJlKTsKKwkJCXRhYmxlVmlld2VyLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJCQkJRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdClzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW1FZGl0b3IoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpOworCQkJCQlMaXN0PFBpY3RvZ3JhbUVsZW1lbnQ+IHBlcyA9IEdyYXBoaXRpLmdldExpbmtTZXJ2aWNlKCkuZ2V0UGljdG9ncmFtRWxlbWVudHMoZGlhZ3JhbSwgb2JqZWN0KTsKKwkJCQkJZ2V0RGlhZ3JhbUVkaXRvcigpLnNldFBpY3RvZ3JhbUVsZW1lbnRGb3JTZWxlY3Rpb24ocGVzLmdldCgwKSk7CisJCQkJCWdldERpYWdyYW1FZGl0b3IoKS5yZWZyZXNoKCk7CisJCQkJfQorCQkJfSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDdXN0b20gY29udGVudCBwcm92aWRlciBmb3IgYSBnYXRld2F5J3MgaW5jb21pbmcgYW5kIG91dGdvaW5nIHNlcXVlbmNlIGZsb3dzCisJICovCisJcHVibGljIGNsYXNzIFNlcXVlbmNlRmxvd3NMaXN0Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgTGlzdENvbXBvc2l0ZUNvbnRlbnRQcm92aWRlciB7CisKKwkJcHVibGljIFNlcXVlbmNlRmxvd3NMaXN0Q29udGVudFByb3ZpZGVyKEFic3RyYWN0TGlzdENvbXBvc2l0ZSBsaXN0Q29tcG9zaXRlLCBFT2JqZWN0IG9iamVjdCkgeworCQkJc3VwZXIobGlzdENvbXBvc2l0ZSwgb2JqZWN0LCBudWxsLCBudWxsKTsKKwkJCQorCQkJR2F0ZXdheSBnYXRld2F5ID0gKEdhdGV3YXkpb2JqZWN0OworCQkJbGlzdCA9IG5ldyBCYXNpY0VMaXN0PEVPYmplY3Q+KCk7CisJCQlsaXN0LmFkZEFsbChnYXRld2F5LmdldEluY29taW5nKCkpOworCQkJbGlzdC5hZGRBbGwoZ2F0ZXdheS5nZXRPdXRnb2luZygpKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOworCQl9CisJfQorCQorCS8qKgorCSAqIEEgY3VzdG9tIGNvbHVtbiBwcm92aWRlciBmb3Igc2VxdWVuY2UgZmxvd3MKKwkgKi8KKwlwdWJsaWMgY2xhc3MgU2VxdWVuY2VGbG93TGlzdENvbHVtblByb3ZpZGVyIGV4dGVuZHMgTGlzdENvbXBvc2l0ZUNvbHVtblByb3ZpZGVyIHsKKworCQlwdWJsaWMgU2VxdWVuY2VGbG93TGlzdENvbHVtblByb3ZpZGVyKEFic3RyYWN0TGlzdENvbXBvc2l0ZSBsaXN0LCBFT2JqZWN0IG9iamVjdCkgeworCQkJc3VwZXIobGlzdCwgZmFsc2UpOworCQkJLy8gYWRkIDIgb3IgMyBjb2x1bW5zLCBkZXBlbmRpbmcgb24gZ2F0ZXdheSB0eXBlCisJCQlhZGQobmV3IFNlcXVlbmNlRmxvd0xpc3RDb2x1bW4ob2JqZWN0LDEpKTsgLy8gaWRlbnRpZmllciAoZnJvbSAtPiB0bykKKwkJCWFkZChuZXcgU2VxdWVuY2VGbG93TGlzdENvbHVtbihvYmplY3QsMikpOyAvLyBDb25kaXRpb24gKGV4cHJlc3Npb24pCisJCQlpZiAob2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgiZGVmYXVsdCIpIT1udWxsKSB7CisJCQkJYWRkKG5ldyBTZXF1ZW5jZUZsb3dMaXN0Q29sdW1uKG9iamVjdCwzKSk7IC8vIElzIERlZmF1bHQgKGJvb2xlYW4pCisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogQSBjdXN0b20gVGFibGVDb2x1bW4gZm9yIHNlcXVlbmNlIGZsb3dzCisJICovCisJcHVibGljIGNsYXNzIFNlcXVlbmNlRmxvd0xpc3RDb2x1bW4gZXh0ZW5kcyBUYWJsZUNvbHVtbiB7CisKKwkJaW50IGNvbHVtbkluZGV4OworCQkKKwkKKwkJLyoqCisJCSAqIENvbnN0cnVjdCBhIGNvbHVtbiBieSBnaXZpbmcgaXQgdGhlIGdhdGV3YXkgRU9iamVjdCBhbmQgY29sdW1uIGluZGV4CisJCSAqIEBwYXJhbSBnYXRld2F5IC0gdGhlIEdhdGV3YXkgQlBNTjIgZWxlbWVudAorCQkgKiBAcGFyYW0gY29sdW1uSW5kZXggLSBhIGNvbHVtbiBpbmRleCBiZXR3ZWVuIDEgYW5kIDM6CisJCSAqIDEgPSBkZXNjcmliZXMgdGhlIHNlcXVlbmNlIGZsb3cgYnkgc291cmNlIGFuZCB0YXJnZXQgZW5kcG9pbnRzCisJCSAqIDIgPSBjb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0aGlzIHNlcXVlbmNlIGZsb3cKKwkJICogMyA9IHRydWUvZmFsc2UgaWYgdGhpcyBzZXF1ZW5jZSBmbG93IGlzIHRoZSBkZWZhdWx0IGZvciB0aGUgZ2F0ZXdheQorCQkgKi8KKwkJcHVibGljIFNlcXVlbmNlRmxvd0xpc3RDb2x1bW4oRU9iamVjdCBnYXRld2F5LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCXN1cGVyKGdhdGV3YXksIChFU3RydWN0dXJhbEZlYXR1cmUpbnVsbCk7CisJCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldEhlYWRlclRleHQoKSB7CisJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7CisJCQljYXNlIDE6CisJCQkJcmV0dXJuICJTZXF1ZW5jZSBGbG93IjsKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gIkNvbmRpdGlvbiI7CisJCQljYXNlIDM6CisJCQkJcmV0dXJuICJJcyBEZWZhdWx0IjsKKwkJCX0KKwkJCXJldHVybiAiaGVhZGVyICIgKyBjb2x1bW5JbmRleDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCVNlcXVlbmNlRmxvdyBmbG93ID0gKFNlcXVlbmNlRmxvdyllbGVtZW50OworCQkJR2F0ZXdheSBnYXRld2F5ID0gKEdhdGV3YXkpb2JqZWN0OworCQkJU3RyaW5nIHRleHQgPSAiIjsKKwkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKKwkJCWNhc2UgMToKKwkJCQl0ZXh0ICs9IE1vZGVsVXRpbC5nZXREaXNwbGF5TmFtZShmbG93LmdldFNvdXJjZVJlZigpKTsKKwkJCQl0ZXh0ICs9ICIgLT4gIjsKKwkJCQl0ZXh0ICs9IE1vZGVsVXRpbC5nZXREaXNwbGF5TmFtZShmbG93LmdldFRhcmdldFJlZigpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl0ZXh0ID0gTW9kZWxVdGlsLmdldERpc3BsYXlOYW1lKGZsb3cuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpKTsKKwkJCQlpZiAodGV4dD09bnVsbCkKKwkJCQkJdGV4dCA9ICIiOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXsKKwkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBnYXRld2F5LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgiZGVmYXVsdCIpOworCQkJCQlPYmplY3QgZGVmYXVsdEZsb3cgPSBnYXRld2F5LmVHZXQoZik7CisJCQkJCXRleHQgKz0gKGZsb3cgPT0gZGVmYXVsdEZsb3cpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldHVybiB0ZXh0OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKKwkJCXJldHVybiAiY29sdW1uICIgKyBjb2x1bW5JbmRleDsKKwkJfQorCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL3Byb3BlcnR5L3Rhc2tzL0RhdGFBc3NvY2lhdGlvbkRldGFpbENvbXBvc2l0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9wcm9wZXJ0eS90YXNrcy9EYXRhQXNzb2NpYXRpb25EZXRhaWxDb21wb3NpdGUuamF2YQppbmRleCBlMDg4NTU5Li5mNWIzYWY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL3Byb3BlcnR5L3Rhc2tzL0RhdGFBc3NvY2lhdGlvbkRldGFpbENvbXBvc2l0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvdGFza3MvRGF0YUFzc29jaWF0aW9uRGV0YWlsQ29tcG9zaXRlLmphdmEKQEAgLTgxLDcgKzgxLDcgQEAKICAqICAgIG8gQ29weSB0aGUgRGF0YSBBc3NvY2lhdGlvbiCTc291cmNlUmVmlCB2YWx1ZSBpbnRvIHRoZSCTdGFyZ2V0UmVmLpQgT25seSBvbmUKICAqICAgICAgc291cmNlUmVmIHBhcmFtZXRlciBpcyBhbGxvd2VkIGluIHRoaXMgY2FzZS4JCQkJCQogICovCi1wdWJsaWMgY2xhc3MgRGF0YUFzc29jaWF0aW9uRGV0YWlsQ29tcG9zaXRlIGV4dGVuZHMgRGVmYXVsdERldGFpbENvbXBvc2l0ZSBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKK3B1YmxpYyBjbGFzcyBEYXRhQXNzb2NpYXRpb25EZXRhaWxDb21wb3NpdGUgZXh0ZW5kcyBEZWZhdWx0RGV0YWlsQ29tcG9zaXRlIHsKIAkKIAlwdWJsaWMgZW51bSBNYXBUeXBlIHsKIAkJTm9uZSwKQEAgLTI4MiwxMyArMjgyLDIwIEBACiAJCX0KIAkJcmV0dXJuIE1hcFR5cGUuTm9uZTsKIAl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0vLwkJdXBkYXRlV2lkZ2V0cygpOworCQorCXByaXZhdGUgdm9pZCByZWRyYXdQYXJlbnQoKSB7CisJCS8vIHRoaXMgRGV0YWlsQ29tcG9zaXRlIHNob3VsZCBiZSBzaXR0aW5nIGluIGEgU2FzaEZvcm0gY3JlYXRlZAorCQkvLyBieSBhIExpc3RDb21wb3NpdGUuIGxheW91dCB0aGlzIHRoaW5nIGZpcnN0CisJCWxheW91dCgpOworCQkvLyBhbmQgdGhlbiBzZWFyY2ggZm9yIHRoZSBEZXRhaWxDb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgbGlzdCAKKwkJQ29tcG9zaXRlIHBhcmVudCA9IGdldFBhcmVudCgpOworCQl3aGlsZSAocGFyZW50IT1udWxsKSB7CisJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3REZXRhaWxDb21wb3NpdGUpIHsKKwkJCQlwYXJlbnQubGF5b3V0KCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgdXBkYXRlV2lkZ2V0cygpIHsKQEAgLTQwNyw3ICs0MTQsNyBAQAogCQkJCQkJc2hvd0FkdmFuY2VkTWFwcGluZ1dpZGdldHMoZmFsc2UpOwogCiAJCQkJCQlzaG93UHJvcGVydHlXaWRnZXRzKHRydWUpOwotCQkJCQkJcmVkcmF3UGFnZSgpOworCQkJCQkJcmVkcmF3UGFyZW50KCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9KTsKQEAgLTQyNiw3ICs0MzMsNyBAQAogCQkJCQkJc2hvd0FkdmFuY2VkTWFwcGluZ1dpZGdldHMoZmFsc2UpOwogCiAJCQkJCQlzaG93VHJhbnNmb3JtYXRpb25XaWRnZXRzKHRydWUpOwotCQkJCQkJcmVkcmF3UGFnZSgpOworCQkJCQkJcmVkcmF3UGFyZW50KCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9KTsKQEAgLTQ0NSw3ICs0NTIsNyBAQAogCQkJCQkJc2hvd0FkdmFuY2VkTWFwcGluZ1dpZGdldHMoZmFsc2UpOwogCiAJCQkJCQlzaG93RXhwcmVzc2lvbldpZGdldHModHJ1ZSk7Ci0JCQkJCQlyZWRyYXdQYWdlKCk7CisJCQkJCQlyZWRyYXdQYXJlbnQoKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0pOwpAQCAtNDY0LDcgKzQ3MSw3IEBACiAJCQkJCQlzaG93RXhwcmVzc2lvbldpZGdldHMoZmFsc2UpOwogCQkJCQkJCiAJCQkJCQlzaG93QWR2YW5jZWRNYXBwaW5nV2lkZ2V0cyh0cnVlKTsKLQkJCQkJCXJlZHJhd1BhZ2UoKTsKKwkJCQkJCXJlZHJhd1BhcmVudCgpOwogCQkJCQl9CiAJCQkJfQogCQkJfSk7CkBAIC01MzEsOCArNTM4LDYgQEAKIAkJCQkJfTsKIAkJCQkJcHJvcGVydHlEZXRhaWxzQ29tcG9zaXRlLnNldEJ1c2luZXNzT2JqZWN0KGFzc29jaWF0aW9uKTsKIAkJCQkJcHJvcGVydHlEZXRhaWxzQ29tcG9zaXRlLnNldFRpdGxlKCJQcm9wZXJ0aWVzIik7Ci0JCQkJCS8vIE95IHZleSEgRml4IHRoaXMhCi0JCQkJCWdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmxheW91dCgpOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UgewpAQCAtNTkzLDcgKzU5OCw3IEBACiAJCQkJfQogCQkJCXRyYW5zZm9ybWF0aW9uRGV0YWlsc0NvbXBvc2l0ZS5zZXRCdXNpbmVzc09iamVjdCh0cmFuc2Zvcm1hdGlvbik7CiAJCQkJdHJhbnNmb3JtYXRpb25EZXRhaWxzQ29tcG9zaXRlLnNldFRpdGxlKCJUcmFuc2Zvcm1hdGlvbiIpOwotCQkJCXRyYW5zZm9ybWF0aW9uRGV0YWlsc0NvbXBvc2l0ZS5yZWRyYXdQYWdlKCk7CisvLwkJCQl0cmFuc2Zvcm1hdGlvbkRldGFpbHNDb21wb3NpdGUucmVkcmF3UGFnZSgpOwogCQogCQkJfQogCQkJZWxzZSB7CkBAIC02NjUsNyArNjcwLDcgQEAKIAkJCQl9CiAJCQkJZXhwcmVzc2lvbkRldGFpbHNDb21wb3NpdGUuc2V0QnVzaW5lc3NPYmplY3QoZXhwcmVzc2lvbik7Ly9hc3NvY2lhdGlvbi5nZXRleHByZXNzaW9uKCkpOwogCQkJCWV4cHJlc3Npb25EZXRhaWxzQ29tcG9zaXRlLnNldFRpdGxlKCJFeHByZXNzaW9uIik7Ci0JCQkJZXhwcmVzc2lvbkRldGFpbHNDb21wb3NpdGUucmVkcmF3UGFnZSgpOworLy8JCQkJZXhwcmVzc2lvbkRldGFpbHNDb21wb3NpdGUucmVkcmF3UGFnZSgpOwogCQkJfQogCQkJZWxzZSB7CiAJCQkJaWYgKGV4cHJlc3Npb25Db21wb3NpdGUhPW51bGwpIHsKQEAgLTcxNyw3ICs3MjIsNyBAQAogCQkJCX0KIAkJCQl0cmFuc2Zvcm1hdGlvbkRldGFpbHNDb21wb3NpdGUuc2V0QnVzaW5lc3NPYmplY3QodHJhbnNmb3JtYXRpb24pOy8vYXNzb2NpYXRpb24uZ2V0VHJhbnNmb3JtYXRpb24oKSk7CiAJCQkJdHJhbnNmb3JtYXRpb25EZXRhaWxzQ29tcG9zaXRlLnNldFRpdGxlKCJUcmFuc2Zvcm1hdGlvbiIpOwotCQkJCXRyYW5zZm9ybWF0aW9uRGV0YWlsc0NvbXBvc2l0ZS5yZWRyYXdQYWdlKCk7CisvLwkJCQl0cmFuc2Zvcm1hdGlvbkRldGFpbHNDb21wb3NpdGUucmVkcmF3UGFnZSgpOwogCQkJCQogCQkJCWlmIChhc3NpZ25tZW50c1RhYmxlIT1udWxsKQogCQkJCQlhc3NpZ25tZW50c1RhYmxlLmRpc3Bvc2UoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvdGFza3MvSW9QYXJhbWV0ZXJzRGV0YWlsQ29tcG9zaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLnVpL3NyYy9vcmcvZWNsaXBzZS9icG1uMi9tb2RlbGVyL3VpL3Byb3BlcnR5L3Rhc2tzL0lvUGFyYW1ldGVyc0RldGFpbENvbXBvc2l0ZS5qYXZhCmluZGV4IDExMmViMjMuLjBlZDc0MWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIudWkvc3JjL29yZy9lY2xpcHNlL2JwbW4yL21vZGVsZXIvdWkvcHJvcGVydHkvdGFza3MvSW9QYXJhbWV0ZXJzRGV0YWlsQ29tcG9zaXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS9zcmMvb3JnL2VjbGlwc2UvYnBtbjIvbW9kZWxlci91aS9wcm9wZXJ0eS90YXNrcy9Jb1BhcmFtZXRlcnNEZXRhaWxDb21wb3NpdGUuamF2YQpAQCAtNjgsNyArNjgsNyBAQAogCQkJLy8gdGhlIGNvbnRyb2wgcGFyYW1ldGVyIG11c3QgYmUgYW4gQWN0aXZpdHkgb3IgQ2FsbGFibGVFbGVtZW50IChpLmUuIGEgUHJvY2VzcyBvciBHbG9iYWxUYXNrKQogCQkJSW5wdXRPdXRwdXRTcGVjaWZpY2F0aW9uIGlvU3BlY2lmaWNhdGlvbiA9IChJbnB1dE91dHB1dFNwZWNpZmljYXRpb24pYmUuZUdldChpb1NwZWNpZmljYXRpb25GZWF0dXJlKTsKIAkJCWlmIChpb1NwZWNpZmljYXRpb249PW51bGwpIHsKLQkJCQlpb1NwZWNpZmljYXRpb24gPSAoSW5wdXRPdXRwdXRTcGVjaWZpY2F0aW9uKSBNb2RlbFV0aWwuY3JlYXRlRmVhdHVyZShiZSxpb1NwZWNpZmljYXRpb25GZWF0dXJlKTsKKwkJCQlpb1NwZWNpZmljYXRpb24gPSAoSW5wdXRPdXRwdXRTcGVjaWZpY2F0aW9uKSBGQUNUT1JZLmNyZWF0ZUlucHV0T3V0cHV0U3BlY2lmaWNhdGlvbigpOwogCQkJCUluc2VydGlvbkFkYXB0ZXIuYWRkKGJlLCBpb1NwZWNpZmljYXRpb25GZWF0dXJlLCBpb1NwZWNpZmljYXRpb24pOwogCQkJfQogCg==